看板 Knuckles
作者 標題 [JS] 使用立即執行的匿名函式 減少使用全域變數
時間 2012年10月21日 Sun. AM 01:37:07
在 JavaScript 中存取一個變數時
會先尋找目前的區域變數中有沒有這個變數,沒有的話再往上一層區域找
最後才會找全域變數,也就是 window 下的變數
例如
a = 1; // 全域變數a
b = 2; // 全域變數b
function myfun(){
}
myfun(); // 執行
b = 2; // 全域變數b
function myfun(){
var a = 3; //區域變數a
alert('a:'+a+',b:'+b); //會顯示 a:3,b:2
}
myfun(); // 執行
以往偷懶的寫法,都是把一堆需要跨函式的變數都設成全域變數
每個函式的名稱也都是全域變數
但這樣每次存取就都要一層一層的往上找直到全域範圍
而全域範圍已經有很多東西了,再加上一堆東西的話會造成效能不佳
且有可能會跟其他載入的 script 裡的名稱有衝突
所以比較好的方法是把自己的程式全都用一個立即執行的匿名函式包起來
並且把函式的名稱都改用區域變數來存
(function(){
})();
var a = 1;
var b = 2;
var myfun = function(){
var a = 3; //區域變數a
alert('a:'+a+',b:'+b); //會顯示 a:3,b:2
}
myfun(); // 執行
})();
其中立即執行的匿名函式
(function(){ /*...*/ })();
也可以看成像下面這樣function init(){ /*...*/ };
init();
宣告一個 init 函式後立即執行init();
簡寫成匿名函式的話就不用再幫他取名字了
也可以把 window 物件也傳進去變成一個區域變數 window
就可以用這個區域變數來存取其他全域變數了
例如可以讀取 jQuery 的 $ 變數
然後把 $ 也變成區域變數
(function(window){ //用區域變數 window 來存 全域變數 window
})(window); //傳入全域變數 window
var $ = window.jQuery; // 把 jQuery 的 $ 變成區域變數
//...
})(window); //傳入全域變數 window
對物件使用"="傳給另一個值時,是使用傳址的方式,而不是傳值
所以只是同一個物件變成有兩個名字,而不會複製成另一個物件
a = {};
a.x = 1;
b = a;
b.x = 2;
alert(a.x); //顯示 2
alert(b.x); //顯示 2
a.x = 1;
b = a;
b.x = 2;
alert(a.x); //顯示 2
alert(b.x); //顯示 2
把程式全部包在一個匿名函式後
就不能在 HTML 中使用 onclick 執行自己寫的函式了
<a href="#" id="myBtn" onclick="myfun(); return false;">按鈕1</a>
這樣的按鈕點下去會出現"myfun() is not defined"要改成綁定事件的寫法
(function(){
})();
$('#myBtn').click(function(){
//點按鈕後要執行的事情
myfun();
});
var myfun = function(){ /*...*/ };
})();
--
※ 作者: Knuckles 時間: 2012-10-21 01:37:07
※ 編輯: Knuckles 時間: 2016-11-23 00:55:02
※ 看板: KnucklesNote 文章推薦值: 2 目前人氣: 0 累積人氣: 5905
( ̄︶ ̄)b layzer, andrew5106 說讚!
※
Knuckles
轉錄至看板 Knuckles_note (使用連結) 時間:2012-10-21 16:27:17
回列表(←)
分享