绑定实例方法与包装在匿名函数中

时间:2016-03-24 21:41:23

标签: javascript

[这与Bound function instead of closure to inject extra arguments有关,但既没有明确要求也没有回答。]

我正在调用一个函数,它希望函数作为参数。我想从我的类传递一个方法,绑定到我的类的一个实例。为清楚起见,假设我的课程如下:

var MyClass = function() {}
MyClass.prototype.myMethod = function() { ... }

var my_instance = new MyClass();

使用bind

之间是否存在实质性差异?
doSomething(my_instance.myMethod.bind(my_instance))

并将调用包装在匿名函数中:

doSomething(function() { my_instance.myMethod(); })

1 个答案:

答案 0 :(得分:1)

如果您班级中的原型需要生成回调,则可能不知道其实例的名称。因此,您需要使用this,但this的值取决于回调的执行位置。

考虑以下示例:

var MyClass = function (x) { this.something = x; };
MyClass.prototype.makeCall = function () {
    var myBadCallback  = function() { console.log(this.something); };
    var myGoodCallback = function() { console.log(this.something); }.bind(this);

    // When called, the value of "this" points to... we don't know
    callMeBack( myBadCallback );

    // When called, the value of "this" points to this instance
    callMeBack( myGoodCallback );
};


function callMeBack( callback ) { callback(); };

var foo = new MyClass('Hello World!');
var bar = new MyClass('Goodbye!');

// Probably prints "undefined", then prints "Hello World!"
foo.makeCall();

// Probably prints "undefined", then prints "Goodbye!"
bar.makeCall();

在上面的示例中,第一个输出可能会打印undefined,因为上下文(this引用的内容)在回调执行时已更改。

这个例子可能看似人为,但出现了这种情况,常见的情况是AJAX回调。