什麼是閉包(closure),爲何要用它?

閉包是指有權訪問另外一個函數做用域中變量的函數,建立閉包的最多見的方式就是在一個函數內建立另外一個函數,經過另外一個函數訪問這個函數的局部變量,利用閉包能夠突破做用鏈域,將函數內部的變量和方法傳遞到外部。javascript

閉包的特性:html

1.函數內再嵌套函數
2.內部函數能夠引用外層的參數和變量
3.參數和變量不會被垃圾回收機制回收java

//li節點的onclick事件都能正確的彈出當前被點擊的li索引
 <ul id="testUL">
    <li> index = 0</li>
    <li> index = 1</li>
    <li> index = 2</li>
    <li> index = 3</li>
</ul>
<script type="text/javascript">
    var nodes = document.getElementsByTagName("li");
    for(i = 0;i<nodes.length;i+= 1){
        nodes[i].onclick = function(){
            console.log(i+1);//不用閉包的話,值每次都是4
        }(i);
    }
</script>

  執行say667()後,say667()閉包內部變量會存在,而閉包內部函數的內部變量不會存在; 使得Javascript的垃圾回收機制GC不會收回say667()所佔用的資源; 由於say667()的內部函數的執行須要依賴say667()中的變量; 這是對閉包做用的很是直白的描述node

  function say667() {
    // Local variable that ends up within closure
    var num = 666;
    var sayAlert = function() {
        alert(num);
    }
    num++;
    return sayAlert;
}

 var sayAlert = say667();
 sayAlert()//執行結果應該彈出的667
相關文章
相關標籤/搜索