Javascript fn.apply,第一个参数为null或未定义

Javascript fn.apply,第一个参数为null或未定义,javascript,Javascript,我对这件事感到困惑。比如说, 考虑一下这个片段 Array.min = function(){ return Math.min.apply( Math, arr ); } 我能理解。我理解fn.apply为 使用给定的此值和作为数组提供的参数调用函数 但下面的代码片段也可以使用 Array.min = function(){ return Math.min.apply( null, arr ); } Array.min = function(){ return Mat

我对这件事感到困惑。比如说,

考虑一下这个片段

Array.min = function(){
    return Math.min.apply( Math, arr );
}
我能理解。我理解fn.apply为

使用给定的此值和作为数组提供的参数调用函数

但下面的代码片段也可以使用

Array.min = function(){
    return Math.min.apply( null, arr );
}

Array.min = function(){
    return Math.min.apply( undefined, arr );
}
MDN解释为

如果方法是非严格模式代码中的函数,则null和 未定义的将替换为全局对象和基本体 值将被装箱

我不太明白我所说的大胆的部分。那句话是什么意思?有人能详细说明一下吗?

全局对象就是全局对象。只是:

唯一的全局对象是在控件进入任何执行上下文之前创建的

除了本规范中定义的属性外,全局对象还可能具有其他主机定义的属性。这可能包括其值为全局对象本身的属性;例如,在HTML文档对象模型中,全局对象的
窗口
属性就是全局对象本身

在浏览器中,您实际上是在调用
Math.min.apply(window,arr)
,您可以验证:

(function() {
    console.log(this);  // Logs `Window {...}`
}).apply(undefined);
这是非严格模式的许多问题之一
有时会变成
窗口
,您最终会以创建全局属性而告终。在严格模式下,
将真正是
未定义的

(function() {
    'use strict';

    (function() {
        console.log(this);  // Logs `undefined`
    }).apply(undefined);
})();
“原语值将被装箱”只是说像数字和字符串这样的原语将被“装箱”到容器对象中,因为原语本身不是对象。同样,您可以验证这一点:

(function() {
    console.log(this);  // Logs `Number {}`, not `2`
}).apply(2);

这里有一些关于原语的更多信息:

如果该方法是非严格模式代码中的函数,null和undefined将替换为全局对象

i、 e.窗口,如果是浏览器,我不确定它在nodejs中指的是什么

和基本值将被装箱


原语值将被包装到其相应的对象中,即在
fn的情况下。应用(2,args)
变量
fn
将引用值为2的数字对象

nodejs也是全局对象
窗口
。@vdua:Node.js使用
全局