我們知道,在創建一個函數時如果要用到變量來存取信息的話,要盡量使用局部變量。
因為一方面局部變量會隨着函數的執行結束被銷毀;另一方面在不執行函數的時候也不會創建這個局部變量,對節省空間資源有很大的好處。
下面我們來看一個案例:
1 var num = 1; //全局變量num
2
3 function a() { 4 console.log(num); 5 } 6
7 function b() { 8 console.log(num); 9 } 10
11 a(); //調用函數a,結果會在控制台打印1
12 b(); //調用函數b,結果會在控制台打印1
上面這個案例里的變量num就是一個典型的全局變量。
那么我們要怎么把num變成局部變量呢?
方法一:
1 function a() { 2 var num = 1; 3 console.log(num); //打印1
4 } 5
6 function b() { 7 var num = 1; 8 console.log(num); 9 } 10
11 a(); //調用函數a,結果會在控制台打印1
12 b(); //調用函數b,結果會在控制台打印1
上面這種方法雖然解決了全局變量的問題,但是多次定義相同變量num。使得代碼冗余,不夠優化。這種方法不推薦
方法二:
1 var demo = function () { 2 var num = 1; 3
4 function a() { 5 console.log(num); 6 } 7
8 function b() { 9 console.log(num); 10 } 11
12 a(); //調用函數a,結果會在控制台打印1
13 b(); //調用函數b,結果會在控制台打印1
14 } 15
16 demo(); //調用函數demo,獲得函數a、函數b、變量num
上面這種方法二將num、函數a、函數b都寫在一個demo函數里,這樣就將變量num變成了一個局部變量,而且函數a和函數b也都可以訪問到變量num
但是,這種方法也有弊端。
- 如果函數demo不執行,就無法獲取函數a、函數b、變量num。
- demo也是一個全局變量。也就是說我們雖然沒有定義全局變量num,卻又定義了一個全局變量demo。顯然這並沒有達到我們最初的目的。
- 每次調用函數a和函數b之前都得先調用demo,這樣會使代碼冗余。萬一我們哪次忘記調用demo了怎么辦呢?
所以,這種也不推薦。
那我們該怎么辦呢?==>匿名函數自執行
方法三:匿名函數自執行(推薦)
1 (function () { 2 var num = 1; 3
4 function a() { 5 console.log(num); 6 } 7
8 function b() { 9 console.log(num); 10 } 11
12 a(); 13 b(); 14 })();
匿名函數自執行沒有定義任何一個全局變量,我們也不用每次先調用外面的函數獲取里面的內容。完美的解決了我們的需求。極力推薦。
寫在后面:
什么是匿名函數?什么是函數自執行?匿名函數還有其他好的應用?或許我的其他博客https://www.cnblogs.com/CurryLi/ 可以幫到你哦,歡迎您的到來。
//調用函數a,結果會在控制台打印1