0

我有一个函数functionWithDifferentScope,它接受一个对象myobject.options作为参数。选项对象中的一对是回调,它指向myObject中定义的函数:myCallback

我想要实现的是将myObject 命名空间注入到在全局级别(由第 3 方)定义的函数的回调中。

一个简化的例子:

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的后续调用将识别为window

有没有办法将myObject 命名空间作为参数传递给myObject.options.callback值?

4

2 回答 2

0

我认为您正在寻找的是原型样式“绑定”

基本上“this.myCallback(this)”是对该函数的调用。

this.myCallback 是函数本身。(它是一个具有 type 函数的对象)。

您可以使用可在函数上使用的方法“调用”或“应用”来调用它。它将调用这些函数。

看:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FGlobal_Objects%2FFunction%2Fapply

第一个参数是要工作的对象上下文。我认为您所说的对象命名空间是什么意思。

所以: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 的返回值作为回调传递,并确保该方法将在正确的对象上执行。

于 2013-11-02T20:07:28.123 回答
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();
于 2013-11-02T20:07:35.340 回答