相对于JavaScript来说,这是相对较新的,因此任何帮助/解释都将不胜感激。
我有以下玩具代码示例,正在努力向自己解释为什么我会得到这样的输出。
const list = [1, 2];
let newlist = list.map(function (num){
console.log(this); // logs the global / window object in the console
return num * 2;
});
回调函数中的console.log(this)语句将全局或窗口对象记录在控制台中。我已经完成了doc的数组原型的map()方法检查,并指出map()方法有第二个参数 thisArg 。进一步说, “如果提供了thisArg参数来进行映射,它将用作回调的this值。否则,未定义的值将用作其this值”
我没有为 thisArg 参数提供任何值,因此根据文档,我期望console.log()语句打印出 未定义 。所以问题是,为什么上面的示例代码中的“ this”指向全局对象?
答案 0 :(得分:1)
在浏览器中,调用任何匿名函数:
(function(){
console.log(this === window); //true
}())
因此,您知道默认情况下,它指向窗口对象。除非,您通过调用方法从原型call
,apply
等传递其他内容。现在来看一下地图polyfill:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map
这是关键所在:
callback.call(T, kValue, k, O);
请注意,当且仅当arguments.length > 1
时T是您的thisArg,否则将保留undefined
。并从MDN Function.prototype.call
中猜出什么:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call
.call
方法将undefined替换为global
(窗口):
function.call(thisArg, arg1, arg2, ...)
thisArg
可选。此值提供给函数调用。请注意,这可能不是该方法看到的实际值:如果该方法是非严格模式下的函数,则将null和undefined替换为全局对象,并将原始值转换为对象。