在查看jQuery的未压缩源代码时,我偶然发现了一些我不太了解的内容。当创建他们的匿名函数时,他们将undefined作为第二个参数。这是做什么的,为什么他们使用undefined?是否有必要将undefined作为参数放在匿名函数中?以下是我所说的一个例子。
(function( window, undefined) {
...code here
})( window );
答案 0 :(得分:17)
这是做什么的,是将undefined
重新分配到该关闭内的undefined
。这是一个失败的安全措施。因为其他代码可能会意外地执行类似
undefined = something;
console.log(undefined); // will output 'something'
这在javascript中有效(如果使用的JS引擎未实现ECMAScript 5规范,则在ECMAScript 5规范中undefined
为非non-writable
,MDN DOC),
来自MDN New_in_JavaScript 1.8.5(ECMA 5)页面
的报价对全局对象的更改
全局对象设为只读
全球 NaN ,无限和未定义 根据ECMAScript 5规范,对象已经只读。
来自Guthub的ES5 Annotated Spec
ES5 spec Section
x15.1.1.3
15.1.1.3 undefined
未定义的值未定义(参见8.1)。
此属性具有{ [[Writable]]:false ,[[Enumerable]]:false,[[Configurable]]:false}。
即使global undefined
不可写,您也可以拥有一个名为undefined
的局部变量,并且可能会破坏您的代码(主要是与undefined
的比较)。 但这是你的责任。你可以拥有像
(function(){
console.log('Second Case: ');
var undefined = 'Something';
console.log(undefined); // Will log `something`
var a ; // a is undefined
console.log(a === undefined); // false, as undefined is changed
// you might expect a === undefined will return true, but as
// `undefined` is changed it will return false.
console.log(a); // undefined
})();
演示: http://jsfiddle.net/joycse06/V4DKN/
但是,如果undefined
可写,那么上述作业可能会妨碍许多comparison
在代码行之后undefined
undefined
,因为undefined
不再是( window ) // one argument only
。它现在有一些价值。
因为他们正在调用像
这样的匿名函数( window, undefined) // only window is passed when calling the function
// Second argument is not passed means it's undefined
// so undefined is restored to undefined inside that function
// and no global accidental assignments can hamper jQuery's
// code using 'undefined' now
接收
undefined
这意味着封闭undefined
内部已恢复为undefined
,因为它尚未传递任何值,从而确保在匿名函数中使用var a;
typeof a; //"undefined"
window.b;
typeof window.b; //"undefined"
var c = (function() {})();
typeof c; //"undefined"
var d = (function(e) {return e})();
typeof d; //"undefined"
。
我引用上面文章链接中的一些内容来说清楚
什么是未定义的?
在JavaScript中,未定义(类型),未定义(值)和未定义(变量)。
未定义(类型)是内置的JavaScript类型。
undefined(value)是一个原语,是Undefined类型的唯一值。
未分配值的任何属性都假定未定义的值。 (ECMA 4.3.9 和4.3.10)。
没有return语句的函数或具有空return语句的函数返回undefined。未解释的函数参数的值未定义。
typeof undefined; //"undefined"
var f = 2;
f = undefined; //re-assigning to undefined (variable)
typeof f; //"undefined"
undefined(variable)是一个全局属性,其初始值为undefined(value),因为它是一个全局属性,我们也可以将它作为变量访问。为了保持一致性,我总是在本文中将其称为变量。
undefined = "washing machine"; //assign a string to undefined (variable)
typeof undefined //"string"
f = undefined;
typeof f; //"string"
f; //"washing machine"
从ECMA 3开始,可以重新分配其值:
{{1}}
毋庸置疑,将值重新分配给未定义的变量是非常糟糕的做法,事实上ECMA 5不允许这样做。
答案 1 :(得分:3)
Undefined是一个类型,但也是一个全局变量。
您可以通过执行undefined = whatever
来创建一个覆盖未定义值的模块。
undefined
实际上是包装整个代码的函数的未定义参数:
(function(window, undefined) {
// undefined is the undefined parameter
}(window));
这是安全的,因为undefined
参数在本地范围内,除了此函数中的代码之外没有人可以分配给它。
在定义匿名函数时,没有必要使用undefined
作为参数。
如果您看到上述功能,您会发现它需要两个参数,但提供一个。
为什么undefined
需要恢复?
因为,要确保花括号之间的范围内undefined
确实是undefined
,即使有人在全局范围内写了类似undefined = "defined";
的内容,因为{{1}实际上可以重新定义。
所以,如果您有类似
的内容undefined
答案 2 :(得分:2)
jQuery通过不将参数传递给该参数来确保undefined
在其范围内确实未定义。
例如,当undefined
未实际未定义时,请使用此代码:
var undefined = 1;
alert(undefined); // 1