forEach函数调用的调用上下文(this)

kev*_*ius 25 javascript foreach function this invocation

我想知道forEach回调函数的'this'值(或调用上下文)是什么.此代码似乎不起作用:

var jow = [5, 10, 45, 67];

jow.forEach(function(v, i, a){

    this[i] = v + 1;

});

alert(jow);
Run Code Online (Sandbox Code Playgroud)

谢谢你向我解释.

Tib*_*bos 45

MDN声明:

array.forEach(callback [,thisArg])

如果向forEach提供thisArg参数,则它将用作每个回调调用的this值,就像调用callback.call(thisArg,element,index,array)一样.如果thisArg未定义或为null,则函数中的此值取决于函数是否处于严格模式(如果处于严格模式则传递值,如果处于非严格模式则传递全局对象).

简而言之,如果你只提供回调并且你处于非严格模式(你提出的情况),那么它将是全局对象(窗口).

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach

  • 那很奇怪。如果我在对象上创建方法,则“ this”值将是该对象。为什么有什么不同? (2认同)

kev*_*ius 10

我完成了forEach方法的构建,并希望与大家分享这个图表,希望它能帮助其他人试图了解其内部工作原理.

forEach方法

  • 我的意思是一般的布局,这个图是完全不可读的 (3认同)

the*_*eye 6

如果不将第二个参数传递给forEachthis将指向全局对象。为了实现你想要做的事情

var jow = [5, 10, 45, 67];

jow.forEach(function(v, i, a) {
    a[i] = v + 1;
});

console.log(jow);
Run Code Online (Sandbox Code Playgroud)

输出

[ 6, 11, 46, 68 ]
Run Code Online (Sandbox Code Playgroud)


vla*_*lad 6

里面的forEach,this指的是全局window对象。即使您从不同的对象(即您创建的对象)调用它也是如此

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
Run Code Online (Sandbox Code Playgroud)

  • 这大多是真的。但是你可以在回调之后传递一个 `thisArg` 来定义 `this` 所指的内容。在你的例子中,你可以调用 `[''].forEach(function (...) {...}, myObj)`,这样 `this.foo` 就会返回 `'object'` 而不是 `'window'`。 (4认同)
  • 有趣的是,默认情况下,`thisArg` 指的是全局`window` 对象(我已经在我的浏览器中对其进行了测试),而在规范中它说如果没有提供`thisArg`,它应该是默认情况下为“未定义”。MDN:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach。规格:https://www.ecma-international.org/ecma-262/5.1/#sec-15.4.4.18 (2认同)