我尝试使用一些 ES5 的数组额外方法,例如map
,、some
forEach
[1, 2, 3].forEach(function (el) {
console.log(this) // window
})
但我发现这些方法中的上下文不是调用它们的数组
但是之 Global context
类的window
。
在 MDN看来
当一个函数作为对象的方法被调用时,它的 this 被设置为调用该方法的对象。
那么数组和被调用方法之间究竟是什么关系呢?
我尝试使用一些 ES5 的数组额外方法,例如map
,、some
forEach
[1, 2, 3].forEach(function (el) {
console.log(this) // window
})
但我发现这些方法中的上下文不是调用它们的数组
但是之 Global context
类的window
。
在 MDN看来
当一个函数作为对象的方法被调用时,它的 this 被设置为调用该方法的对象。
那么数组和被调用方法之间究竟是什么关系呢?
this
设置为在方法内部forEach
调用 forEach 的数组。但是,您传递给 forEach 方法的匿名函数没有将其this
设置为数组,因为该函数没有作为数组上的方法调用。(但是您可以将数组forEach
作为thisArg提供给方法,因此this
在匿名函数中将指向该数组。
例子:
var a = [1, 2, 3];
a.forEach(function (el) {
console.log(this) // the Array
}, a);
或绑定函数:
var a = [1, 2, 3];
a.forEach((function (el) {
console.log(this) // the Array
}).bind(a));
如果您查看developer.mozilla.org,您会看到的签名forEach
是:
array.forEach(callback[, thisArg])
接着
如果为 forEach 提供了 thisArg 参数,则它将用作每次回调调用的 this 值,就像调用了 callback.call(thisArg, element, index, array) 一样。如果 thisArg 为 undefined 或 null,则函数中的 this 值取决于函数是否处于严格模式(如果处于严格模式则传递值,如果处于非严格模式则为全局对象)。
所以你永远不会收到array
asthis
除非你把它作为第二个参数forEach
。