Arrays 混淆ES5′;s数组额外方法';上下文

Arrays 混淆ES5′;s数组额外方法';上下文,arrays,function,ecmascript-5,Arrays,Function,Ecmascript 5,我尝试使用一些ES5的数组额外方法,如map,some,forEach [1, 2, 3].forEach(function (el) { console.log(this) // window }) 但是我发现这些方法中的上下文不是调用它们的数组 但是全局上下文类似于窗口 在MDN中 当函数作为对象的方法调用时,它的this设置为 调用该方法的对象 那么,数组和被调用方法之间的确切关系是什么呢?如果您仔细查看,就会发现forEach的签名是: forEach(回调[,thisArg]

我尝试使用一些ES5的数组额外方法,如
map
some
forEach

[1, 2, 3].forEach(function (el) {
    console.log(this) // window
})
但是我发现这些方法中的上下文不是调用它们的数组

但是
全局上下文
类似于
窗口

在MDN中

当函数作为对象的方法调用时,它的this设置为 调用该方法的对象

那么,数组和被调用方法之间的确切关系是什么呢?

如果您仔细查看,就会发现
forEach
的签名是:

forEach(回调[,thisArg])

然后

如果为forEach提供了thisArg参数,则它将用作每次回调调用的this值,就像调用了callback.call(thisArg、元素、索引、数组)一样。如果thisArg未定义或为null,则函数中的this值取决于函数是否处于严格模式(如果处于严格模式,则传递值;如果处于非严格模式,则全局对象)


因此,除非将
数组作为
forEach
的第二个参数设置为
forEach
方法中调用forEach的数组,否则将永远不会将
数组作为
this
接收。但是,传递给forEach方法的匿名函数没有将其
this
设置为数组,因为该函数不是作为数组上的方法调用的。(但是您可以将数组作为提供给
forEach
方法,因此匿名函数中的
将指向数组

例如:

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));

匿名回调函数不是数组的方法,
forEach()
是。