Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript forEach函数调用的调用上下文(this)_Javascript_Function_Foreach_This_Invocation - Fatal编程技术网

Javascript 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

我想知道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(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