01
今天在讀 jQuery代碼的時候,發現下面的寫法:
02
(function( window, undefined ) {
03
… // code goes here
04
})(window);
05
window 肯定是沒問題, 表示 BOM 瀏覽器物件模型中的 window 對象。但是這裡為什麼會有一個名為 undefined 的形參呢?起初的時候很不理解。去技術群請教了一下,才真正理解了這裡的原因。
06
原來,Javascript 中的 undefined 並不是作為關鍵字(全部Javascript關鍵字列表)出現的。因此可以允許使用者對其賦值。例如:
07
varundefined = ‘myValue’;
08
如此一來,假如 jQuery 中使用下面的寫法:
09
(function( window ) {
10
… // code goes here
11
})(window);
12
必然造成中間代碼裡的 undefined 遭到汙染。因為在預設情況下,對於一個未定義的變數,它的值應該是 undefined,假如使用者使用形如
13
varundefined = ‘myValue’;
14
// 或者
15
window.undefined = ‘myValue’;
16
的代碼進行賦值,那麼,jQuery 中的 undefined 的值就變成了使用者指定的值(這裡是字串 ‘myValue’)。這樣會造成 jQuery 內部異常。
17
18
而 jQuery 採用的這種寫法,就很好的避免了這個問題。在執行匿名函數的時候,只傳遞一個參數 window, 而不傳遞 undefined,那麼函數體中的 undefined 局部變數的值,剛好就是 undefined. 甚為巧妙啊。
19
20
比較下面幾段代碼:
21
22
<script type=”text/javascript”>
23
(function(window, undefined){
24
alert(undefined);
25
})(window);
26
</script>
27
28
<script type=”text/javascript”>
29
var undefined = ‘myValue’;
30
(function(window){
31
alert(undefined);
32
})(window);
33
</script>
34
35
<script type=”text/javascript”>
36
var undefined = ‘myValue’;
37
(function(window, undefined){
38
alert(undefined);
39
})(window);
40
</script>
41
42
<script type=”text/javascript”>
43
var undefined = ‘myValue’;
44
window.undefined = ‘myValue_2′;
45
(function(window){
46
alert(undefined);
47
})(window);
48
</script>
49
50
<script type=”text/javascript”>
51
var undefined = ‘myValue’;
52
window.undefined = ‘myValue_2′;
53
(function(window, undefined){
54
alert(undefined);
55
})(window);
56
</script>
作者:leon_lau