3

我很困惑fn.apply。例如,

考虑这个片段

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

我能掌握这一点。我将 fn.apply 理解为,

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

但下面的片段也有效

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

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

MDN 将其解释为,

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

我不太明白我加粗的部分。那句话的意思是什么?谁能详细说明一下?

4

2 回答 2

9

“全局对象”是全局对象。只需阅读规范

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

除了本规范中定义的属性之外,全局对象可能还有其他主机定义的属性。这可能包括一个属性,其值为全局对象本身;例如,在 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);

这里有一些关于原语的更多信息:为什么 JavaScript 原语不是 instanceof Object?

于 2013-11-06T04:50:29.957 回答
0

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

即浏览器的窗口,我不确定它在nodejs的情况下指的是什么,

原始值将被装箱

原始值将被包装到它们对应的对象中,即如果内部fn.apply(2, args)变量将引用值为 2 的数字对象。thisfn

于 2013-11-06T04:53:16.123 回答