传入的目的是什么
What is the purpose of passing-in undefined?
我注意到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,全局属性undefined
、NaN
和Infinity
变为只读。因此,随着它在所有现代浏览器中的普遍采用——当然除了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)),因此实际上是未定义的。
- 这是什么 ==- javascript 运算符
- 我的单元测试选项是什么
- 打破承诺链的好方法是什么
- 在AngularJS应用程序中使用封装指令和路由的推荐方式是什么
- Javascript中的空白是什么
- 是什么让一个“;Uncaught RangeError:超过了最大调用堆栈大小“;错误(Chrome,在其他浏览器中显示
- 在JavaScript中拆分日期字符串的更好方法是什么
- 将jQuery.ech()方法转换为本地JavaScript抽象的最佳方法是什么
- 处理浮点错误的最佳方法是什么
- javascript导入的最佳实践是什么
- 基于窗口宽度jquery的函数的替代方法是什么
- 在ng重复循环中显示条件内容的最佳方式是什么
- 我的客户端选项是什么
- 这是什么“;要求“;事情
- 未捕获的类型错误:topFrame.window.changeSelectedBarStyle不是函数,原因是什么
- 实现比较方法的最佳实践是什么;s的比较类型是在运行时选择的
- @@(“at at”)在ES6 JavaScript中是什么意思
- knex:根据结果创建数组的合适方法是什么
- JSDoc:模块和名称空间之间的关系是什么
- minimy javascript是什么意思?Backbone.js