这是类 [duplicate] 函数内部的窗口

this is window inside the function of a class [duplicate]

提问人:Caleb Hillary 提问时间:4/21/2021 更新时间:4/21/2021 访问量:251

问:

我这里有一些代码。 我知道此引用不会在匿名函数中携带。 但是在这里,即使使用对象的函数,里面的这个也是窗口。

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

未定义的推送。

检查时,此处是窗口对象

我想知道为什么这里是窗口,以及如何重构我的代码以正确处理这个问题。

JavaScript 这个 原型

评论

2赞 Nick Parsons 4/21/2021
当您将函数引用传递给 时,它会丢失它的 ,因为它不再被调用(即:myObj)。该方法允许您为回调指定 this:forEachthisthis.forEach().forEach(this.addToArray, this)

答:

0赞 Vijay S Nair 4/21/2021 #1

在将回调函数体作为回调传递给 后,对对象的引用不再是构造函数。将函数体与当前上下文绑定,代码应该可以正常工作。thisMyClassforEachthis

    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。