【问题标题】:Can a parameter be passed to a function that is set as an object literal value?可以将参数传递给设置为对象文字值的函数吗?
【发布时间】:2013-11-02 19:58:04
【问题描述】:

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

我想要实现的是将 myObject namespace 注入到在全局级别(由第 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(); 被调用。在第一次执行期间,thismyObject,但随后通过 functionWithDifferentScope 的调用将 this 识别为 window。

有没有办法将 myObject namespace 作为参数传递给 myObject.options.callback 值?

【问题讨论】:

  • 调用functionWithDifferentScope(this.options);根据上下文或您的选择,您可以使用 functionWithDifferentScope.call(this, this.options); ..这是你想要的吗?
  • @Robert functionWithDifferentScope 在全局级别运行,因此给它本地 this 会破坏函数的其他部分。我正在寻找一种将this 传递给单个回调的方法;如果这有意义的话。
  • 您能否给出一些使用示例,并注明您期望的上下文等。我知道您想要什么,但您可能需要稍微重写 myObject 以便能够更轻松地修改选项

标签: javascript namespaces parameter-passing object-literal


【解决方案1】:

你是这个意思吗?

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

【讨论】:

    【解决方案2】:

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

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

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

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

    见:

    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) 返回一个您可以调用的函数对象,该对象将自动注入正确的上下文,因此您可以单独传递 bind 的返回值作为回调,并确保该方法将在正确的对象上执行.

    【讨论】:

    • 所以是的,我正在寻找类似的东西,但我不想给调用函数this,我只想给回调this
    • Bind 是你的朋友。它是一个由 Prototype.js 引入的实用函数,并且非常受欢迎,因此它进入了其他库和 Javascript 本身的更新实现我有一个对象 Dog,它有一个方法 Bark,我想传递一个 Function 对象,它将在 Dog 对象上调用方法 Bark,这样: var f = dog.bark.bind(dog) 返回一个 Function 对象。任何调用 f.call() 的人都在做同样的调用:dog.bark.call(dog)
    • 因此,从 Javascript 5 开始,您将使用以下语言进行绑定:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… 特别参见第一个示例。
    猜你喜欢
    • 1970-01-01
    • 2020-07-22
    • 1970-01-01
    • 1970-01-01
    • 2022-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多