传入的目的是什么

What is the purpose of passing-in undefined?

本文关键字:是什么      更新时间:2023-09-26

我注意到jQuery和相关的注释记号插件(如jQuery.UI)将undefined作为参数传递到其模块定义中使用的匿名函数中,如:

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

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

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

它不应该一直都有吗?为什么把它传进来?这里还有其他目的或把戏吗?

这有两个原因:

1) 如果undefined是函数范围中的一个变量,而不是全局对象属性,则迷你程序可以将其缩减为一个字母,从而实现更好的压缩率。

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

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

通过有一个不传递参数的函数参数undefined(名称实际上并不重要),您可以确保您有一个真正的undefined变量,这样您就可以针对这个变量测试"不确定性"。

Btw。测试未定义的最安全方法是:typeof ( var ) === 'undefined'

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

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

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

因此,为了确保undefine实际上是未定义的,即使其他"邪恶"脚本会用另一个值重新分配undefine,你也要创建一个你称之为undefine的参数,然后当你调用函数时,你要确保不要将值传递给该参数-因此,你可以确保变量undefine在你的函数中总是未定义的。

所以在jQuery的情况下:

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

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

现代浏览器

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

undefined不是javascript中的保留字,它只是一个变量。jQuery确保,如果某个糟糕的开发人员在他们的javascript中覆盖了undefined的值,那么jQuery将忽略它,并建立自己的变量undefine,该变量从未传递过值(请参阅末尾的自执行(jQuery)),因此实际上是未定义的。