【问题标题】:uncaugth typerror with coffeescripts generated js使用咖啡脚本生成的 js 未捕获的类型错误
【发布时间】:2014-08-04 04:44:41
【问题描述】:

我开始学习 javascript/coffeescript 与骨干,我得到一个我不明白的错误。任何帮助将不胜感激。

我做了一个很简单的例子,下面是buggy.coffeecoffeescript 文件:

class Panel extends Backbone.Model
p = Panel()  # I instantiate it to trigger the error

我使用coffee -c buggy.coffee 编译成buggy.js。但是当我运行它并查看 javascript 控制台时,我得到了错误:

Uncaught TypeError: undefined is not a function

错误发生在backbone.js(第256行)::

var Model = Backbone.Model = function(attributes, options) {
  var attrs = attributes || {};
  options || (options = {});
  this.cid = _.uniqueId('c');
  this.attributes = {};
  if (options.collection) this.collection = options.collection;
  if (options.parse) attrs = this.parse(attrs, options) || {};
  attrs = _.defaults({}, attrs, _.result(this, 'defaults'));
  this.set(attrs, options);    ### <================================== here
  this.changed = {};
  this.initialize.apply(this, arguments);
};

因为this.set 未定义。

现在我通过编辑buggy.js找到了一种避免错误的方法(注释是原始的coffeescript生成的行):

    function Panel() {
      #return Panel.__super__.constructor.apply(this, arguments);
      return new Panel.__super__.constructor(this, arguments);
    }

但这不可能是一个真正的解决方案。 那么我做错了什么?

【问题讨论】:

  • p = new Panel(),你错过了关键字'new'
  • 谢谢。我想我累了(凌晨 1 点被问到),现在我感到很惭愧:-/ ...

标签: javascript backbone.js coffeescript


【解决方案1】:

在 JavaScript 中实例化对象时,必须使用 new 关键字。 p = Panel() 失败,但 p = new Panel() 会工作。

如果不包含 new 关键字,则 this 不会绑定到新对象。相反,它被绑定到全局对象。因此,与其创建新的Panel,不如破坏全局对象的属性。您还将调用该全局对象(例如,如果您编写 this.func())而不是面板,这可能是此错误表现为“未定义不是函数”的原因。

【讨论】:

  • 我真的很感谢new的效果的解释。正如问题中所评论的那样,我一定真的很累忘记新事物并且没有单独意识到它。但我也被错误和以下事实所误导:(1)可以在没有 new 的情况下调用构造函数,以及(2)this 实际上被设置了一些东西。
猜你喜欢
  • 2012-08-13
  • 2014-11-04
  • 1970-01-01
  • 1970-01-01
  • 2013-01-09
  • 1970-01-01
  • 2013-06-26
相关资源
最近更新 更多