【发布时间】:2013-07-25 05:38:24
【问题描述】:
我花了一天的大部分时间阅读有关模块模式及其“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({})thingy,设置var self = this;(相应地调用self.publicA_helper())。没有运气。
最后,我添加了一个私有变量var self;,以及一个公共方法:
init: function() {self = this;},
...通过确保在将objA.publicA 传递给objB.callback 之前调用objA.init();,事情确实有效。
我无法强调有更好的方法来做到这一点。我错过了什么?
【问题讨论】:
-
那里 - 根据 Bergi 和 Beetroot-Beetroot 的建议更改了我的代码。仍然要解决这个小警告:stackoverflow.com/questions/17864608/… ...
标签: javascript callback closures this module-pattern