传入undefined的目的是什么?

时间:2012-03-07 14:03:12

标签: javascript jquery plugins

我注意到jQuery和相关的主题插件,例如jQuery.UIundefined作为参数传递给模块定义中使用的匿名函数,如下所示:

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

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

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

不管怎样它不应该总是可用吗?为什么传递它?这里有其他目的或伎俩吗?

3 个答案:

答案 0 :(得分:71)

有两个原因:

1)如果undefined是函数作用域中的变量而不是全局对象属性,则minifiers可以将其减少为单个字母,从而实现更好的压缩率。

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

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

通过让函数参数undefined(名称实际上无关紧要),你没有传递参数,你可以确保你有一个真正undefined的变量,这样你就可以测试此变量的“undefinedness”。

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

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

答案 1 :(得分:17)

这样做是为了确保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将是未定义的。

现代浏览器

在现代浏览器中,undefinedECMAScript 5 specification的不可配置,不可写属性。

答案 2 :(得分:10)

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