Javascript 如何使用';这';内forEach循环

Javascript 如何使用';这';内forEach循环,javascript,function,foreach,this,Javascript,Function,Foreach,This,在以下对象中,我在使用“this”引用时遇到问题: function SampleObject(){ this.addObject = function(object){...} ... // more code here ... this.addNewObjects= function(arr){ arr.forEach( function (obj) { this.addObject(new Obj(obj.pr

在以下对象中,我在使用“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循环解决了这个问题,但是,我不明白为什么这不起作用,我想知道是否有其他方法可以做到这一点。

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

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));
}
另请注意,如果没有这些
,此
将是窗口对象而不是obj<代码>此
始终是使用新关键字或窗口对象(如果是正常功能)创建的对象。在严格模式下,
在这种情况下,此
将未定义

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

this.addNewObjects = function(arr) {
    arr.forEach((obj) => {
        this.addObject(new Obj(obj.prop1, obj.prop2));
    });
}
this.addNewObjects = function(arr) {
    arr.forEach(function(obj) {
        this.addObject(new Obj(obj.prop1, obj.prop2));
    }, this);
}
箭头函数没有自己的
这个
,它们是从外部范围获得的

UPDATE2:在@viery365 comment中,您可以将此作为forEach的第二个参数,它将为函数创建上下文:

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

常量数组1=[
{姓名:“约翰”,年龄:20},{姓名:“萨拉”,年龄:70}
];
array1.forEach(element=>this.print(element));
打印=(数据)=>
{
console.log(data.name);
}
//预期产出:“约翰”

//预期输出:“sarah”
在哪里/如何调用
SampleObject()
?我建议您阅读
这篇
:或@javinor谢谢,这些文章非常有用。函数创建作用域,因此“this”归窗口对象所有,窗口对象是“this”的默认所有者。此问题与“this”的所有者完全不同。对于
forEach()
(与问题相关)的情况,也可以在回调后使用“内置”第二个参数-
thisArg
。示例:
arr.forEach(回调,this)@viery365哦不知道,你应该在我们的解决方案中添加你自己的答案。这可能更适合
forEach()
。对于这个特定的问题,没有选项可以回答,可能是因为被标记为重复。但不管怎么说,你的答案几乎完美无瑕,我也从中吸取了教训。我的评论只是补充。