How to function call using 'this' inside forEach loop

后端 未结 2 1961
南方客
南方客 2020-12-13 03:41

In the following object, I have a problem using the \'this\' reference:

function SampleObject(){
    this.addObject = function(object){...}
    ...
    // mo         


        
相关标签:
2条回答
  • 2020-12-13 04:30

    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"

    There is better way to do this

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

    0 讨论(0)
  • 2020-12-13 04:35

    You can store this in variable:

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

    or use bind:

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

    And side note, without those this will be window object not obj. This is always object that was created using new keyword or window object if it's normal function. In strict mode this will be undefined in this case.

    UPDATE: and with ES6 you can use arrow function:

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

    arrow functions don't have their own this and they get it from outer scope.

    UPDATE2: from @viery365 comment you can use this as second argument to forEach and it will make context for the function:

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

    You can read this on MDN forEach page

    0 讨论(0)
提交回复
热议问题