'这'当创建函数存储在哈希中的JS对象时,其作用域为窗口对象
'this' being scoped to window object when creating JS object where function is stored in a hash
我不确定这个标题是否有意义,但本质上,我正试图为我正在开发的应用程序编写一个非常简单的Javascript依赖注入容器。
这是集装箱:
jedi = new function() {
var library = {};
this.module = function(name, module) {
if (arguments.length == 1) {
return library[name];
}
library[name] = module;
};
};
然后我创建了一个骨干模型,并将其作为依赖项添加,如下所示:
(function () {
var addColourSchemeModel = Backbone.Model.extend({
getColourJSON: function(prop) {
var cols = this.get(prop).split(',');
return {
R: cols[0],
G: cols[1],
B: cols[2]
};
}
});
jedi.module('AddColourSchemeModel', addColourSchemeModel);
})();
当我尝试创建这个模块的新实例时,问题就出现了,如下所示:
var colourModel = new jedi.module('AddColourSchemeModel')({
// json object containing model values
});
我得到一个错误Object [object global] has no method 'set'
。
奇怪的是,正在调用Backbone Model initialize方法等,但this
的作用域是窗口,而不是正在初始化的对象,这就是错误发生的地方,因为它试图在某个时刻调用this.set
,但这实际上是窗口。
创建实例时,需要将jedi.module('AddColourSchemeModel')
放在括号中。否则您的代码将被解释为:
var colourModel = (new jedi.module('AddColourSchemeModel'))({
// json object containing model values
});
所以正确的方法应该是:
var colourModel = new (jedi.module('AddColourSchemeModel'))({
// json object containing model values
});
这一切都是因为javascript如何绑定"This",即执行all时的上下文。它引起了来自其他不同背景的人最初的困惑。JavaScript中的Getting Out of Binding Situations为您所看到的内容提供了极好的解释。有各种技术可以解决这个问题:-)
以下是一些可能有帮助的文章,
- 摆脱JavaScript中的绑定情况
- 了解Backbone.js中的Bind和bindAll
- var self=this;一个糟糕的模式
- 这个self-window和windowself有什么区别
希望得到帮助。
相关文章:
- 向Angular作用域对象添加对象数组——TypeError
- 为什么对象的函数值没有自己的作用域
- 访问Javascript对象-Node.js的作用域问题
- 阻止控制器创建新的作用域对象
- 尝试将变量传递到对象中时的作用域问题'的方法构造函数
- 将对象作为参数传递时的 Javascript 函数作用域
- 在对象类上实现 jquery 作用域的最佳方法
- 嵌套的Angular指令触发父对象上的作用域函数
- 如何创建作用域的动态、基于实例的对象文字
- AngularJS select with ng选项不更新父作用域中的引用对象属性
- 作用域,在回调中丢失对对象的引用
- 在嵌套对象中继承此作用域
- Javascript作用域问题,对象在分配后没有数据
- Javascript-确定对象中是否有任何作用域引用
- 如何从不同的对象作用域访问可观察对象
- Javascript/jQuery对象作用域问题
- 2对象作用域相互冲突
- Javascript函数作用域vs对象作用域
- NodeJS不能访问子节点中的对象作用域
- 为什么将变量(在对象作用域之外)设置为等于对象方法返回未定义的结果?