【问题标题】:fn.apply with first param null or undefinedfn.apply 第一个参数为 null 或 undefined
【发布时间】:2013-11-06 04:46:10
【问题描述】:

我对@9​​87654321@ 感到困惑。例如,

考虑一下这个sn-p

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

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

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

但下面的 sn-ps 也可以工作

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

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

MDN 对此解释为,

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

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

【问题讨论】:

    标签: javascript


    【解决方案1】:

    “全局对象”是全局对象。就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?

    【讨论】:

    • 在 nodejs 的情况下也是全局对象window ??
    • @vdua:Node.js 使用global
    【解决方案2】:

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

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

    原始值将被装箱

    原始值将被包装到它们对应的对象中,即在 fn.apply(2, args) 的情况下,fn 中的变量 this 将引用值为 2 的数字对象。

    【讨论】:

      猜你喜欢
      • 2010-11-03
      • 2022-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-13
      相关资源
      最近更新 更多