Javascript forEach函数调用的调用上下文(this)
我想知道forEach回调函数的“this”值(或调用上下文)是什么。此代码似乎不起作用:Javascript forEach函数调用的调用上下文(this),javascript,function,foreach,this,invocation,Javascript,Function,Foreach,This,Invocation,我想知道forEach回调函数的“this”值(或调用上下文)是什么。此代码似乎不起作用: var jow = [5, 10, 45, 67]; jow.forEach(function(v, i, a){ this[i] = v + 1; }); alert(jow); 感谢您向我解释。MDN声明: array.forEach(回调[,thisArg]) 如果向forEach提供了thisArg参数,则该参数将用作 每个回调调用的此值就像callback.call(thisA
var jow = [5, 10, 45, 67];
jow.forEach(function(v, i, a){
this[i] = v + 1;
});
alert(jow);
感谢您向我解释。MDN声明:
array.forEach(回调[,thisArg])
如果向forEach提供了thisArg参数,则该参数将用作
每个回调调用的此值就像callback.call(thisArg,
元素、索引、数组)被调用。如果此参数未定义或为空,
函数中此值的大小取决于函数是否为
是否处于严格模式(如果处于严格模式,则传递值为全局对象
如果处于非严格模式)
因此,简而言之,如果您只提供回调,并且您处于非严格模式(您介绍的情况),那么它将是全局对象(窗口)
如果不将第二个参数传递给
forEach
,此
将指向全局对象。实现你想做的事
var jow = [5, 10, 45, 67];
jow.forEach(function(v, i, a) {
a[i] = v + 1;
});
console.log(jow);
输出
[ 6, 11, 46, 68 ]
我完成了forEach方法的构建,并想与大家分享这个图,希望它能帮助其他人理解它的内部工作原理
在forEach内部,
此
引用全局窗口
对象。即使您从不同的对象(即您创建的对象)调用它,情况也是如此
我有一个非常简单的方法来解决“这个”上下文问题,它是这样的: 无论何时,只要您想知道“this”的上下文是什么,请检查留给调用方的是谁,如果左边没有调用方,则是全局调用方,否则就是该对象实例: 示例:
let obj={name:“test”,fun:printName}
函数printName(){
console.log(this.name)
}
//谁留给打电话的人?obj!所以obj将是“这”
obj.fun()//测试
//谁留给打电话的人?全球的!因此,全球将是“这”
printName()//未定义(全局没有name属性)
这很奇怪。如果我在一个对象上创建一个方法,“this”值将是该对象。为什么会有所不同?forEach主体中的这个
实际上是您的特定数组,但它与您提供的回调之间没有任何联系。不管forEach的实现如何调用回调,特别是使用thisArg、window或元素。Thx,我就到了。。。我使用jow数组作为thisArg,但得到的结果不好:。为什么呢?当您使用数组中的值作为要更改的元素的索引时,-this-的值似乎会随着window对象和jow arrayYou之间的每次迭代而跳跃。第一次迭代将jow[1]更改为5(将2替换为5),第二次迭代将jow[5]更改为5(最后再添加5),第三次迭代将jow[3]更改为5(将4替换为5),每隔一次迭代将jow[5]更改为5。。在类方法的上下文中,作为forEach参数传递的嵌套经典函数将保留原始类实例作为this值(假定函数不是强制的),听起来像箭头函数的行为,不是吗!?另请参见lol此图中的间距实际上并不意味着任何东西。我指的是总体布局,此图完全无法访问。每个()上下文都应该位于此上下文中。在sdev中,上下文几乎总是包装其子对象。我确实喜欢UML风格的方法。这基本上是正确的。但您可以在回调后传递一个thisArg
,以定义此所指的内容。在您的示例中,您可以调用[''].forEach(function(…){…},myObj)
,这样this.foo
将返回'object'
,而不是'window'
。有趣的是,在默认情况下,thisArg
引用全局window
对象(我已经在浏览器中对其进行了测试),而在规范中指出,如果未提供thisArg
,则默认情况下应为undefined
。MDN:。规格:
window.foo = 'window';
var MyObj = function(){
this.foo = 'object';
};
MyObj.prototype.itirate = function () {
var _this = this;
[''].forEach(function(val, index, arr){
console.log('this: ' + this.foo); // logs 'window'
console.log('_this: ' + _this.foo); // logs 'object'
});
};
var newObj = new MyObj();
newObj.itirate();
// this: window
// _this: object