理解 立即執行函式
阿新 • • 發佈:2021-10-11
概念:
宣告一個函式,並馬上呼叫這個匿名函式就叫做立即執行函式。
宣告方式:
//第一種:用括號把整個函式定義和呼叫包裹起來
(function(){
//function body
}())
//第二種:用括號把函式定義包裹起來,後面再加括號
(function (){
//function body
})()
作用:
建立一個獨立的作用域,這個作用域裡面的變數,外面訪問不到,即避免「變數汙染」。
分析下面程式碼:
<ul id="list"> <li>1</li> <li>2</li> <li>3</li> </ul> <script> varlist = 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了。
那麼該如何解決這個問題:
如果立即執行函式中需要全域性變數,全域性變數會被作為一個引數傳遞給立即執行函式(上例中的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); } }應用場景:
- 改變變數作用域;
上述程式碼就是改變變數作用域,一個很好的例子。
- 封裝臨時變數;
載入只需要執行一次的程式碼,比如顯示時間。這些程式碼也需要一些臨時的變數,但是初始化過程結束之後,就再也不會被用到。這些變數不適合作為全域性變數,產生初始化程式碼遺留。可以用立即執行函式將所有的程式碼包裹在它的區域性作用域中,這些變數都不會在全域性變數中存在,以後也不會其他地方使用,有效的避免了汙染全域性變數。