提问人:Caleb Hillary 提问时间:4/21/2021 更新时间:4/21/2021 访问量:251
这是类 [duplicate] 函数内部的窗口
this is window inside the function of a class [duplicate]
问:
我这里有一些代码。 我知道此引用不会在匿名函数中携带。 但是在这里,即使使用对象的函数,里面的这个也是窗口。
var MyClass = function (div) {
this.array = [];
};
MyClass.prototype = {
addToArray: function (elem) {
this.array.push(elem);
},
processAndAdd: function(elemArray){
elemArray.forEach(this.addToArray);
}
}
var myObj = new MyClass();
myObj.processAndAdd([1, 2, 3]);
console.log('test');
错误:行:this.array.push(elem);
未定义的推送。
检查时,此处是窗口对象
我想知道为什么这里是窗口,以及如何重构我的代码以正确处理这个问题。
答:
0赞
Vijay S Nair
4/21/2021
#1
在将回调函数体作为回调传递给 后,对对象的引用不再是构造函数。将函数体与当前上下文绑定,代码应该可以正常工作。this
MyClass
forEach
this
var MyClass = function (div) {
this.array = [];
};
MyClass.prototype = {
addToArray: function (elem) {
this.array.push(elem);
},
processAndAdd: function(elemArray){
elemArray.forEach(this.addToArray.bind(this));
}
}
var myObj = new MyClass();
myObj.processAndAdd([1, 2, 3]);
console.log('test');
评论
0赞
Caleb Hillary
4/21/2021
bind 的问题在于它会创建一个新函数,对吧?这部分代码将被多次调用,我希望它尽可能高效。我认为尼克的评论可能更适合我。我可以将上下文传递给foreach。
评论
forEach
this
this
.forEach()
.forEach(this.addToArray, this)