我对fn.apply
感到困惑。例如,
考虑这个片段
Array.min = function(){
return Math.min.apply( Math, arr );
}
我能理解这一点。我理解fn.apply as,
调用具有给定值的函数和作为数组提供的参数
但是下面的代码片段也有效
Array.min = function(){
return Math.min.apply( null, arr );
}
Array.min = function(){
return Math.min.apply( undefined, arr );
}
MDN将此解释为,
如果方法是非严格模式代码中的函数,则为null undefined 将替换为全局对象和原始对象 值将加框
我真的不明白我大胆的部分。那句话是什么意思?任何人都可以详细说明一下吗?
答案 0 :(得分:9)
“全局对象”是全局对象。只需read the spec:
在控制进入任何执行上下文之前创建唯一的全局对象。
除了本规范中定义的属性外,全局对象还可能具有其他主机定义的属性。这可能包括一个属性,其值是全局对象本身;例如,在HTML文档对象模型中,全局对象的
window
属性是全局对象本身。
在浏览器中,您实际上是在调用Math.min.apply(window, arr)
,您可以验证:
(function() {
console.log(this); // Logs `Window {...}`
}).apply(undefined);
这是非严格模式的许多问题之一。 this
有时会变为window
,您无声地最终会创建全局属性。在严格模式下,this
将真正为undefined
:
(function() {
'use strict';
(function() {
console.log(this); // Logs `undefined`
}).apply(undefined);
})();
“原始值将被加框”只是说数字和字符串等基元将被“装箱”到容器对象中,因为基元本身不是对象。同样,您可以验证这一点:
(function() {
console.log(this); // Logs `Number {}`, not `2`
}).apply(2);
以下是有关原语的更多信息:Why are JavaScript primitives not instanceof Object?
答案 1 :(得分:0)
如果方法是非严格模式代码中的函数,则null和undefined将替换为全局对象
即。在浏览器的情况下窗口,我不确定它在nodejs的情况下是什么,
和原始值将加框
原始值将被包装到相应的对象中,即fn.apply(2, args)
this
内的变量fn
将引用值为2的数字对象。