【问题标题】:What is the purpose of passing-in undefined?传入未定义的目的是什么?
【发布时间】:2012-03-07 14:03:12
【问题描述】:

我注意到jQuery 和相关的主题演讲插件(如jQuery.UI)将undefined 作为参数传递到其模块定义中使用的匿名函数中,如下所示:

(function($, undefined) { ... })(jQuery);

另外,我注意到 jQuery 推荐的其他插件和/或其他插件不会将 undefined 作为参数传递。

这可能是一个愚蠢的问题,但是......

它不应该总是可用吗?为什么要传进去?这里有什么其他目的或诡计吗?

【问题讨论】:

    标签: javascript jquery plugins


    【解决方案1】:

    有两个原因:

    1) 如果undefined 是函数范围内的变量而不是全局对象属性,则缩小器可以将其缩减为单个字母,从而获得更好的压缩率。

    2) 在 ES5* 之前,undefined 是没有写保护的全局对象的属性。因此它可能会被覆盖,从而导致奇怪和意外的行为。你可以这样做:

    var test = 123;
    undefined = 123;
    if (test === undefined){
       // this will actually be true, since undefined now equals 123
    }
    

    通过有一个函数参数undefined(名称实际上无关紧要),你不传递参数,你可以确保你有一个真正的变量undefined,所以你可以测试“未定义”反对这个变量。

    顺便说一句。测试未定义的最安全方法是:typeof ( var ) === 'undefined'

    (*) 在 EcmaScript 5 中,全局属性 undefinedNaNInfinity 变为只读。因此,随着它在所有现代浏览器中的普遍采用——当然除了 IE 9——覆盖这些值不再可能了。

    【讨论】:

    • jQuery 使用这种方法而不是 typeof 的原因是它在 Javascript 压缩器中压缩得更好。
    • 没错,尽管如此 typeof 是最安全的方法。您还可以使用 undefined 的虚假性质,这将是对 undefined 的最短检查,但会被其他虚假值的存在所掩盖。
    【解决方案2】:

    这样做是为了确保 undefined 始终为 undefined。在旧版本的 ECMAScript 规范(ECMAScript 5 之前)中,undefined 不是保留字,而是常规变量。在较旧的浏览器中,这将是允许的,例如:

    undefined = 2; // Assign a different value to undefined
    
    // Now this statement would be true
    if (undefined == 2)
    

    因此,为了确保 undefined 实际上是未定义的,即使其他一些“邪恶”脚本会用另一个值重新分配 undefined,您也要创建一个称为 undefined 的参数,然后在调用该函数时,确保不将值传递给该参数 - 因此您可以确定变量 undefined 在您的函数中将始终未定义。

    所以在 jQuery 的情况下:

    (function($, undefined) { ... })(jQuery);
    

    为了方便,他们传入 jQuery 并将其分配给 $ 变量,但是他们没有将第二个值传递给 undefined 参数,因此 undefined 将是未定义的。

    现代浏览器

    在现代浏览器中,undefined 根据ECMAScript 5 specification 是一个不可配置、不可写的属性。

    【讨论】:

      【解决方案3】:

      undefined 不是 javascript 中的保留字,它只是一个变量。 jQuery 确保如果一些糟糕的开发人员在他们的 javascript 中覆盖 undefined 的值,那么 jQuery 将忽略它并建立它自己的变量 undefined,它永远不会传递一个值(参见最后的自执行(jQuery))和因此实际上是未定义的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多