【问题标题】:How to function call using 'this' inside forEach loop如何在 forEach 循环中使用“this”进行函数调用
【发布时间】:2015-04-14 11:59:57
【问题描述】:

在以下对象中,我在使用“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));
        });
    }
}

我假设上下文正在发生变化,并且“this”指的是迭代的“obj”,而不是“SampleObject”。我已经使用普通的 for 循环解决了这个问题,但是我很想知道为什么这不起作用,并且想知道是否有其他方法可以做到这一点。

【问题讨论】:

  • 你在哪里/如何打电话给SampleObject()
  • 我建议阅读 this: herehere
  • @javinor 谢谢,这些文章很有帮助。函数创建作用域,因此 'this' 归 Window 对象所有,它是 'this' 的默认所有者。
  • 这个问题根本不是“this”的所有者的副本。

标签: javascript function foreach this


【解决方案1】:

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

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

或使用绑定:

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

附注,没有那些this 将是窗口对象而不是obj。 This 始终是使用 new 关键字或窗口对象创建的对象(如果它是正常功能)。在严格模式下,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阅读这篇文章

【讨论】:

  • forEach()(与问题相关)的情况下,也可以在回调后使用'内置'第二个参数-thisArg。示例:arr.forEach(callback, this);documentation
  • @viery365 哦不知道,您应该在我们的解决方案中添加您自己的答案。这对于forEach() 来说可能会更好。
  • 没有选项可以回答这个特定的问题,可能是因为被标记为重复。但无论如何,你的答案几乎是完美的,我也从中吸取了教训。我的评论只是一个补充。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-16
    • 1970-01-01
    相关资源
    最近更新 更多