fn.apply with first param null或undefined

时间:2013-11-06 04:46:11

标签: javascript

我对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 将替换为全局对象和原始对象   值将加框

我真的不明白我大胆的部分。那句话是什么意思?任何人都可以详细说明一下吗?

2 个答案:

答案 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的数字对象。