什么是未定义的传入的目的?

我已经注意到jQuery和相关的keynote插件,比如jQuery.UIundefined的parameter passing给模块定义中使用的匿名函数,如下所示:

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

或者,我已经注意到由jQuery和/或其他人推荐的其他插件不通过未定义作为参数。

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

它不应该总是可用吗? 为什么通过它? 有没有其他目的或技巧在这里?

有两个原因:

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

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

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

通过使函数参数undefined (名称实际上并不重要),您可以确保您有一个实际上undefined的variables,因此您可以针对此variablestesting“未定义”。

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

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

这样做是为了确保未定义的总是undefined 。 在较早版本的ECMAScript规范(ECMAScript 5之前)中,undefined不是保留字,而是常规variables。 在较旧的浏览器中,这将被允许例如:

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

所以为了确保undefined实际上是未定义的,即使一些其他的“邪恶”脚本将被重定义为未定义的另一个值,你创build一个你调用undefined的参数,然后当你调用该函数时,这个参数的值 – 因此你可以确定undefinedvariables在你的函数中总是不确定的。

所以在jQuery的情况下:

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

他们传递jQuery并将其分配给$variables,以方便起见,但是它们不会将第二个值传递给undefined参数,因此undefined将是未定义的。

现代浏览器

在现代浏览器中,根据ECMAScript 5规范 , undefined是不可configuration的,不可写属性。

undefined不是JavaScript中的保留字,它只是一个variables。 jQuery确保如果一些不好的开发人员在他们的javascript中覆盖未定义的值,那么jQuery将忽略它并build立它自己的variablesundefined,它永远不会传递一个值(见末尾的自执行(jQuery))和因此实际上是未定义的。