'这'当创建函数存储在哈希中的JS对象时,其作用域为窗口对象

'this' being scoped to window object when creating JS object where function is stored in a hash

本文关键字:对象 作用域 窗口 JS 哈希中 创建 函数 存储      更新时间:2023-09-26

我不确定这个标题是否有意义,但本质上,我正试图为我正在开发的应用程序编写一个非常简单的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有什么区别

希望得到帮助。