什么是未定义的传入的目的?
我已经注意到jQuery
和相关的keynote插件,比如jQuery.UI
将undefined
的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,全局属性undefined
, NaN
和Infinity
变成只读。 因此,随着它在所有现代浏览器中的普遍采用 – 当然除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))和因此实际上是未定义的。