可以将参数传递给设置为对象文字值的函数吗?

时间:2013-11-02 19:58:05

标签: javascript namespaces parameter-passing object-literal

我有一个函数 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

2 个答案:

答案 0 :(得分:0)

我认为你要找的是原型“bind”

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

this.myCallback是函数本身。 (它是具有类型函数的对象)。

您可以使用可以在函数上使用的'call'或'apply'方法来调用它。这将称之为这些功能。

请参阅:

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的返回值作为回调,并确保该方法将在正确的对象。

答案 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();