在这种情况下,为什么“此”是全局/窗口对象?

时间:2018-08-15 22:02:34

标签: javascript this

相对于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”指向全局对象?

1 个答案:

答案 0 :(得分:1)

在浏览器中,调用任何匿名函数:

(function(){
    console.log(this === window); //true
}())

因此,您知道默认情况下,它指向窗口对象。除非,您通过调用方法从原型callapply等传递其他内容。现在来看一下地图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替换为全局对象,并将原始值转换为对象。