我有一个函数 functionWithDifferentScope ,它将一个对象 myobject.options 作为参数。 选项对象中的一对是一个回调,它指向 myObject : myCallback 中定义的函数。
我想要实现的是将 myObject 命名空间注入到全局级别(由第三方)定义的函数的回调中。
简化示例:
var myObject = {
options: {
callback: this.myCallback(this),
...,
},
init: function() {
// functionWithDifferentScope operates in the 'window' context
functionWithDifferentScope(this.options);
},
myCallback: function(namespace) {
// 'this' is window
// 'namespace' is myObject
}
}
myObject.init();
执行此脚本时, this.myCallback(this)似乎在定义时执行(由于括号?);以及一旦 myObject.init(); 被篡改。在第一次执行时, myObject ,但后续通过 functionWithDifferentScope 进行的调用将此标识为窗口< /强>
有没有办法将 myObject 名称空间作为参数传递给 myObject.options.callback ?
答案 0 :(得分:0)
我认为你要找的是原型“bind”
基本上“this.myCallback(this)”是对函数的调用。
this.myCallback是函数本身。 (它是具有类型函数的对象)。
您可以使用可以在函数上使用的'call'或'apply'方法来调用它。这将称之为这些功能。
请参阅:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call
第一个参数是要使用的对象上下文。我认为你的意思是对象命名空间。
所以:a.callback(5)
与a.callback.call(a,5)
但请注意,如果您正在使用大多数JavaScript库,这些天您可能有一个“绑定”功能,可以为您完成工作。
http://prototypejs.org/doc/latest/language/Function/prototype/bind/
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind
这个想法是this.callback.bind(this)
返回一个你可以调用的Function对象,它会自动注入正确的上下文,所以你可以单独传递bind的返回值作为回调,并确保该方法将在正确的对象。
答案 1 :(得分:0)
你是说这个吗?
var myObject = new (function() {
var t = this;
vac callback = function() {
// t equals to the myObject-instance
// this equals to window
}
this.init = function() {
funcWithDifferencScope(callback);
}
})();
myObject.init();