如何在forEach循环内使用'this'进行调用

时间:2015-04-14 11:59:57

标签: javascript this

在以下对象中,我使用'这个'参考:

function SampleObject(){
    this.addObject = function(object){...}
    ...
    // more code here
    ...
    this.addNewObjects= function(arr){
        arr.forEach( function (obj) {
            this.addObject(new Obj(obj.prop1, obj.prop2));
        });
    }
}

我假设情境正在发生变化,而且这个'指的是迭代的对象,而不是“样本对象”。我已经使用正常的for循环解决了这个问题,但是,我想知道为什么这不起作用,并且想知道是否有其他方法可以做到这一点。

2 个答案:

答案 0 :(得分:57)

您可以将其存储在变量中:

var self = this;
this.addNewObjects = function(arr){
    arr.forEach(function(obj) {
        self.addObject(new Obj(obj.prop1, obj.prop2));
    });
}

或使用bind:

this.addNewObjects = function(arr) {
    arr.forEach(function(obj) {
        this.addObject(new Obj(obj.prop1, obj.prop2));
    }.bind(this));
}

并注意,没有那些this将是窗口对象而不是obj。 This始终是使用new关键字或window对象创建的对象(如果它是正常函数)。在严格模式下,this在这种情况下将是未定义的。

更新:使用ES6,您可以使用箭头功能:

this.addNewObjects = function(arr) {
    arr.forEach((obj) => {
        this.addObject(new Obj(obj.prop1, obj.prop2));
    });
}

箭头功能没有自己的this,而是从外部范围获取。

UPDATE2 :来自@ viery365评论你可以使用它作为forEach的第二个参数,它将为该函数创建上下文:

this.addNewObjects = function(arr) {
    arr.forEach(function(obj) {
        this.addObject(new Obj(obj.prop1, obj.prop2));
    }, this);
}

您可以在MDN forEach page

上阅读此内容

答案 1 :(得分:0)

const array1 = [
  {name : "john", age: 20}, {name : "sarah", age: 70}
  ];

array1.forEach(element => this.print(element));

print = (data) =>
{
  console.log(data.name);
}
// expected output: "john"
// expected output: "sarah"

有更好的方法

array.forEach(obj => this.functionName(params));