1. 程式人生 > 其它 >理解 立即執行函式

理解 立即執行函式

概念:

宣告一個函式,並馬上呼叫這個匿名函式就叫做立即執行函式。

宣告方式:

//第一種:用括號把整個函式定義和呼叫包裹起來
(function(){
 //function body
}())

//第二種:用括號把函式定義包裹起來,後面再加括號
(function (){
 //function body
})()

作用:

建立一個獨立的作用域,這個作用域裡面的變數,外面訪問不到,即避免「變數汙染」。

分析下面程式碼:

<ul id="list">
  <li>1</li>
  <li>2</li>
  <li>3</li>
</ul>
<script>
var
list = document.getElementById("list");   var li = list.children;   for (var i = 0; i < li.length; i++) {       li[i].onclick = function() {         console.log(i); // 結果總是3.而不是0,1,2      } } </script>

解析:因為i是貫穿整個作用域的,而不是給每一個li分配一個i,點選事件使非同步,使用者一定是在for執行完了以後,才點選,此時i已經變成3了。

那麼該如何解決這個問題:

//使用立即執行函式 varlist=document.getElementById("list"); varli=list.children; for(vari=0;i<li.length;i++){     (function(j){         li[j].onclick=function(){             console.log(j);         }     })(i) }

如果立即執行函式中需要全域性變數,全域性變數會被作為一個引數傳遞給立即執行函式(上例中的i就是一個全域性變數,i代表的是實參,j是i在立即執行函式中的形參)。

//或者使用ES6的塊級作用域 varlist=document.getElementById("list"); varli=list.children; for(leti=0;i<li.length;i++){     li[i].onclick=function(){         console.log(i);     } }

應用場景:

  • 改變變數作用域;

  上述程式碼就是改變變數作用域,一個很好的例子。

  • 封裝臨時變數;

  載入只需要執行一次的程式碼,比如顯示時間。這些程式碼也需要一些臨時的變數,但是初始化過程結束之後,就再也不會被用到。這些變數不適合作為全域性變數,產生初始化程式碼遺留。可以用立即執行函式將所有的程式碼包裹在它的區域性作用域中,這些變數都不會在全域性變數中存在,以後也不會其他地方使用,有效的避免了汙染全域性變數。