从成员函数内部的回调中访问它

Access this from callback inside member function

我正在尝试从成员函数中的回调访问 class 实例。这是一个示例:

MyClass.prototype.foo = function(){
    var arr = [1, 2, 3];
    arr.forEach(function(element){
        //The next line doesn't work
        //becuase this doesn't reference my MyClass-instance anymore
        this.elements.push(element);
    });
}

这里我当然可以使用 for 循环 (for(var i = 0; i < arr.length; i++) {...}),但有些情况我不能。

我找到了一种访问我的 MyClass 实例的方法:

MyClass.prototype.foo = function(){
    var arr = [1, 2, 3];
    var myCurrentInstance = this;    //Store temporary reference
    arr.forEach(function(element){
        //Here it works because I use the temporary reference
        myCurrentInstance.elements.push(element);
    });
}

这对我来说似乎不太干净。有没有更好的方法?

forEach 有一个可选的 thisarg 你可以在传递回调后传递它,所以这应该有效:

MyClass.prototype.foo = function(){
    var arr = [1, 2, 3];
    var myCurrentInstance = this;    //Store temporary reference
    arr.forEach(function(element){
        //Here it works because I use the temporary reference
        this.elements.push(element);
    }, this);
}

函数定义如下:

arr.forEach(callback[, thisArg])

这是文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach

更新

您始终可以使用 bind 来传递参数,尽管它看起来并不漂亮恕我直言:

MyClass.prototype.foo = function(){
    var arr = [1, 2, 3];
    var myCurrentInstance = this;    //Store temporary reference
    var myfunc = function(element){
        //Here it works because I use the temporary reference
        this.elements.push(element);
    }.bind(this);
    myfunc();
}

(我知道这是一个不好的例子,但它演示了绑定的作用)

如果您的环境支持,您可以使用箭头函数(或者您将代码从 ES6 编译到 ES5):

arr.forEach(element => this.elements.push(elements));

在箭头函数内部,this 在词法环境中解析。

有关可能解决方案的完整列表,请参阅 How to access the correct `this` context inside a callback?

但是,如果这就是所有代码,并且 this.elements 是一个数组,您可以直接添加它们而无需显式迭代:

this.elements.push.apply(this.elements, arr);