【问题标题】:How to pass context to anonymous function?如何将上下文传递给匿名函数?
【发布时间】:2012-10-28 04:36:17
【问题描述】:

有一些功能,就是做一些很长的工作并提供回调。

someFunc: function(argument, callback, context) {
  // do something long

  // call callback function
  callback(context);
}

在应用程序中我使用此功能

someFunc('bla-bla', function (context) {
  // do something with this scope
  context.anotherFunc();
}, this);

如何在不传递context参数的情况下实现回调函数?

需要这样的:

someFunc('bla-bla', function () {
  // do something with this scope
  this.anotherFunc();
}, this);

【问题讨论】:

  • 所以在您的最后一个示例中,您似乎正在传递上下文(至少传递给某些东西)您是否只是好奇如何引用未命名的参数?
  • 您正在传递参数,只是没有使用它。我不明白为什么。
  • @bfavaretto:OP 通过将其传递给回调来使用它,以便回调可以利用外部 this 值的方法。所以问题是如何实现最后一个代码块......在回调中获得正确的this,因此它不需要作为参数传递。

标签: javascript callback


【解决方案1】:

使用Function.prototype.call 调用函数并手动设置该函数的this 值。

someFunc: function(argument, callback, context) {
    callback.call(context); // call the callback and manually set the 'this'
}

现在您的回调具有预期的this 值。

someFunc('bla-bla', function () {
  // now 'this' is what you'd expect
    this.anotherFunc();
}, this);

当然,您可以在 .call 调用中像往常一样传递参数。

callback.call(context, argument);

【讨论】:

    【解决方案2】:

    接受的答案似乎有些过时了。假设您在一个相对现代的浏览器上操作,您可以在vanilla javascript 中使用Function.prototype.bind。或者,如果您使用underscorejQuery,则可以分别使用_.bind$.proxy(如有必要,将回退到call/apply)。

    下面是这三个选项的简单演示:

    // simple function that takes another function
    // as its parameter and then executes it.
    function execute_param(func) {
        func();
    }
    
    // dummy object. providing an alternative context.
    obj = {};
    obj.data = 10;
    
    // no context provided
    // outputs 'Window'
    execute_param(function(){
        console.log(this);
    });
    
    // context provided by js - Function.prototype.bind
    // src: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind
    // outputs 'Object { data=10 }''
    execute_param(function(){
        console.log(this);
    }.bind(obj));
    
    // context provided by underscore - _.bind
    // src: http://underscorejs.org/#bind
    // outputs 'Object { data=10 }'
    execute_param(_.bind(function(){
        console.log(this);
    },obj));
    
    // context provided by jQuery - $.proxy
    // src: http://api.jquery.com/jQuery.proxy/
    // outputs 'Object { data=10 }'
    execute_param($.proxy(function(){
        console.log(this);
    },obj));
    

    您可以在此处的 jsfiddle 中找到代码:http://jsfiddle.net/yMm6t/1/注意:确保开发人员控制台已打开,否则您将看不到任何输出

    【讨论】:

    • 是的。现在我到处都使用下划线:)
    • @PiONeeR 是的,我也是 :) 您可能想重新考虑应该接受的答案。
    • 如何在另一个变量名下绑定this?喜欢.bind(that)
    猜你喜欢
    • 2011-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多