我注意到jQuery
和相关的主题插件,例如jQuery.UI
将undefined
作为参数传递给模块定义中使用的匿名函数,如下所示:
(function($, undefined) { ... })(jQuery);
或者,我注意到jQuery推荐的其他插件和/或其他插件不会将undefined作为参数传递。
这可能是一个愚蠢的问题,但是......
不管怎样它不应该总是可用吗?为什么传递它?这里有其他目的或伎俩吗?
答案 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,全局属性undefined
,NaN
和Infinity
变为只读。因此,它在所有现代浏览器中得到普遍采用 - 当然除了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将是未定义的。
现代浏览器
在现代浏览器中,undefined
是ECMAScript 5 specification的不可配置,不可写属性。
答案 2 :(得分:10)
undefined不是javascript中的保留字,它只是一个变量。 jQuery确保如果一些糟糕的开发人员在他们的javascript中覆盖undefined的值,那么jQuery将忽略它并建立它自己的变量undefined,它永远不会传递一个值(参见最后的自执行(jQuery))和因此实际上是未定义的。