1

在我尝试命名我的代码之前,在 Rails 项目中有 2 个咖啡脚本文件生成这个:

(function(){
  window.Investments = {};
}).call(this);

然后我的骨干收藏:

(function(){
  Investments.InfrastructureCollection = Backbone.Collection.extend({});
}).call(this);

chrome 中的控制台抛出了一个Uncaught ReferenceError: Investments is not defined我在页面加载时设置我的 InfrastructureCollection 的地方,但一切似乎都执行得很好,并且事情应该加载。我什至可以创建集合的新实例并在控制台中添加模型,而无需进行任何设置。控制台中发生了什么抛出错误?

4

3 回答 3

1

首先要检查的是看看这是否有效:

var Investments = {};
Investments.InfrastructureCollection = Backbone.Collection.extend({});

没有它周围的所有其他东西。而且,如果这不起作用,那么看看这是否有效:

window.Investments = {};
window.Investments.InfrastructureCollection = Backbone.Collection.extend({});

这些将验证您创建的.Investments对象是否到位或是否存在问题。

然后,最后我看不出为什么你会在两个单独的实例中做这一切:

(function(){

}).call(this);

立即执行函数通常用于为隐私或局部变量创建临时范围,但您没有这些,因此不需要它。其次,为什么.call(this). 同样,这是额外的代码量,根本没有以任何方式使用。如果你想this保持现状,那么首先摆脱立即执行的功能块。

如果您仍然无法弄清楚这一点,那么请尝试在 jsFiddle 中创建一个简单的可重现示例,以便我们可以更准确地看到正在发生的事情。

于 2013-03-11T16:41:47.487 回答
0

不确定您在什么上下文中调用这些(即this在您的调用中指的是什么),但也许您应该更改为:

(function(context){
  context.Investments = {};
}).call(window);

也不确定为什么不能在访问 InfrastructureCollection 之前声明投资

Investments = {};
Investments.InfrastructureCollection = Backbone.Collection.extend({});
于 2013-03-11T16:43:44.900 回答
0

只要您按照这样的顺序保持自调用函数的顺序,就可以了。命名空间的声明显然必须在Collection, Model, etc..

/**Initialize namespace */
(function(){
    window.Investments = {};
}).call(this);

/** Collection */
(function(){
    Investments.Collection = Backbone.Collection.extend({});
}).call(this);

/** Model */
(function(){
    Investments.Model = Backbone.Model.extend({});
}).call(this);

或者只是按原样调用匿名函数并注入Investments对象以确保它确实在范围内(您必须额外检查特定对象是否存在)。

/**Initialize namespace */
(function(){
    window.Investments = {};
})();

/** Collection */
(function(inv){
    inv.Collection = Backbone.Collection.extend({});
})(window.Investments || {});

/** Model */
(function(inv){
    inv.Model = Backbone.Model.extend({});
})(window.Investments || {});

如果您担心order或您的模块,您可以采取的另一个选择是使用像Require JS这样的AMD框架,这样您就不必担心它,您可以配置依赖项,它就会运行。

于 2013-03-11T17:54:55.640 回答