我尝试使用一些ES5的数组额外方法,例如map
,some
,forEach
[1, 2, 3].forEach(function (el) {
console.log(this) // window
})
但我发现这些方法中的上下文不是调用它们的数组
但是Global context
就像window
。
在MDN的opinion
中当一个函数作为一个对象的方法被调用时,它被设置为 调用该方法的对象。
那么数组和被调用方法之间究竟有什么关系?
答案 0 :(得分:1)
如果看on the developer.mozilla.org,您会看到forEach
的签名是:
array.forEach(callback [,thisArg])
然后
如果向forEach提供thisArg参数,则它将用作每个回调调用的this值,就像调用callback.call(thisArg,element,index,array)一样。如果thisArg未定义或为null,则函数中的此值取决于函数是否处于严格模式(如果处于严格模式则传递值,如果处于非严格模式则传递全局对象)。
因此,除非您将其作为array
的第二个参数,否则您将永远不会收到this
forEach
。
答案 1 :(得分:1)
this
设置为forEach
方法中名为的forEach数组。但是,传递给forEach方法的匿名函数没有将this
设置为数组,因为该函数不作为数组上的方法调用。 (但是你可以将数组作为thisArg提供给forEach
方法,因此匿名函数中的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));