爱淘FE

Posted by:
Mickey

每件事最后都会是好事,如果不是好事,说明还没到最后

367

关于jquery中 (function( window, undefined ) {})()写法

今天在读 jQuery代码的时候,发现下面的写法:

1
2
3
(function( window, undefined ) {
... // code goes here
})(window);

window 肯定是没问题, 表示 BOM 浏览器对象模型中的 window 对象。但是这里为什么会有一个名为 undefined 的形参呢?起初的时候很不理解。去技术群请教了一下,才真正理解了这里的原因。

原来,Javascript 中的 undefined 并不是作为关键字(全部Javascript关键字列表)出现的。因此可以允许用户对其赋值。例如:

1
varundefined = 'myValue';

如此一来,假如 jQuery 中使用下面的写法:

1
2
3
(function( window ) {
... // code goes here
})(window);

必然造成中间代码里的 undefined 遭到污染。因为在默认情况下,对于一个未定义的变量,它的值应该是 undefined,假如用户使用形如

1
2
3
4
varundefined = 'myValue';
// 或者
window.undefined = 'myValue';

的代码进行赋值,那么,jQuery 中的 undefined 的值就变成了用户指定的值(这里是字符串 ‘myValue’)。这样会造成 jQuery 内部异常。

而 jQuery 采用的这种写法,就很好的避免了这个问题。在执行匿名函数的时候,只传递一个参数 window, 而不传递 undefined,那么函数体中的 undefined 局部变量的值,刚好就是 undefined. 甚为巧妙啊。

比较下面几段代码: 

<script type=”text/javascript”>
(function(window, undefined){
alert(undefined);
})(window);
</script>

<script type=”text/javascript”>
var undefined = ‘myValue’;
(function(window){
alert(undefined);
})(window);
</script>

<script type=”text/javascript”>
var undefined = ‘myValue’;
(function(window, undefined){
alert(undefined);
})(window);
</script>

<script type=”text/javascript”>
var undefined = ‘myValue’;
window.undefined = ‘myValue_2′;
(function(window){
alert(undefined);
})(window);
</script>

<script type=”text/javascript”>
var undefined = ‘myValue’;
window.undefined = ‘myValue_2′;
(function(window, undefined){
alert(undefined);
})(window);
</script>

发表评论


back up ↑