Arrays 混淆ES5′;s数组额外方法';上下文
我尝试使用一些ES5的数组额外方法,如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]
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()
是。