我花了一天的大部分时间阅读有关模块模式及其“this”范围的信息。最终,我找到了解决问题的方法,尽管感觉有更好的做事方式。
实际代码超过 200 行,但我将其归结为以下内容:objA 有一个方法 (publicA),objB 希望通过回调调用该方法。使事情复杂化的细节是 publicA 需要 publicA_helper 的帮助来完成它的工作。( http://jsfiddle.net/qwNb6/2/ )
var objA = function () {
var privateA = "found";
return {
publicA: function () {
console.log("privateA is " + this.publicA_helper());
},
publicA_helper: function () {
return privateA;
}
};
}();
var objB = function () {
return {
callback: function (callback) {
callback();
}
}
}();
objA.publicA(); // privateA is found
objB.callback(objA.publicA); // TypeError: Object [object global]
很公平——我已经掌握了调用者的上下文往往会影响“this”的值。因此,我添加了一些措施以在 objA 中保留“this”,但这些措施似乎都不起作用。我已经尝试过
var objA = (){}.call({})
设置var self = this;
(相应地调用self.publicA_helper()
)。没运气。
最终,我添加了一个私有变量var self;
以及一个公共方法:
init: function() {self = this;},
...并且通过确保我objA.init();
在传递objA.publicA
给之前打电话objB.callback
,事情确实有效。
我不能强调有更好的方法来做这件事的感觉是多么巨大。我错过了什么?