Javascript 如何将上下文传递给匿名函数?

Javascript 如何将上下文传递给匿名函数?,javascript,callback,Javascript,Callback,有一些函数,它做一些长时间的工作,并提供回调 someFunc: function(argument, callback, context) { // do something long // call callback function callback(context); } 在应用程序中,我使用这个函数 someFunc('bla-bla', function (context) { // do something with this scope context.a

有一些函数,它做一些长时间的工作,并提供回调

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

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

someFunc: function(argument, callback, context) {
    callback.call(context); // call the callback and manually set the 'this'
}
现在,您的回调具有预期的

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

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

callback.call(context, argument);

公认的答案似乎有些过时。假设您使用的是相对现代的浏览器,则可以在中使用
Function.prototype.bind
。或者,如果您正在使用或,则可以分别使用
.bind
$.proxy
(如果需要,这将回退到
调用
/
应用

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

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

您可以在这里的JSFIDLE中找到代码:(注意:确保开发人员控制台处于打开状态,否则您将看不到任何输出)

因此,在最后一个示例中,您似乎在传递上下文(至少是传递给某个对象)您只是想知道如果参数没有命名,如何引用它吗?您在传递参数,而不是使用它。我不明白为什么。@bfavaretto:OP通过将其传递到回调中来使用它,以便回调可以利用外部
this
值的方法。所以问题是如何实现最后的代码块。。。在回调中获取适当的
this
,因此它不需要作为参数传递。是。现在我在所有地方都使用下划线:)@PiONeeR是的,我也是:)您可能需要重新考虑接受的答案是什么。如何将
绑定到另一个变量名下?像
.bind(那个)