传入undefined的目的是什么?

Pri*_*ERO 58 javascript jquery plugins

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

(function($, undefined) { ... })(jQuery);
Run Code Online (Sandbox Code Playgroud)

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

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

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

Chr*_*oph 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
}
Run Code Online (Sandbox Code Playgroud)

通过使用一个函数参数undefined(名称实际上无关紧要),你没有传递参数,你可以确保你有一个真正的变量,undefined你可以测试这个变量的"undefinedness".

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

(*)使用EcmaScript 5,全局属性undefined,NaNInfinity成为readonly.因此,随着它在所有现代浏览器中的普遍采用 - 当然除了IE 9之外 - 不再可能覆盖这些值.

  • jQuery使用这种方法而不是`typeof`的原因是它在Javascript minifier中压缩得更好. (5认同)

Chr*_*son 17

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

undefined = 2; // Assign a different value to undefined

// Now this statement would be true
if (undefined == 2)
Run Code Online (Sandbox Code Playgroud)

因此,为了确保undefined实际上是未定义的,即使某些其他"邪恶"脚本将使用其他值重新分配undefined,您也可以创建一个调用undefined的参数,然后在调用该函数时,确保不通过该参数的值 - 因此您可以确保在函数中始终未定义变量undefined.

所以在jQuery的情况下:

(function($, undefined) { ... })(jQuery);
Run Code Online (Sandbox Code Playgroud)

为了方便起见,它们传入jQuery并将其分配给$变量,但是它们不会将第二个值传递给undefined参数,因此undefined将是未定义的.

现代浏览器

在现代浏览器中,undefined根据ECMAScript 5规范,它是不可配置的不可写属性.


jba*_*bey 10

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