javascript基礎之閉包

    閉包是不少語言都具有的特性,在js中,閉包主要涉及到js的幾個其餘的特性:做用域鏈,垃圾(內存)回收機制,函數嵌套,等等. 程序員

    在理解閉包之前.最好能先理解一下做用域鏈的含義,簡單來講,做用域鏈就是函數在定義的時候建立的,用於尋找使用到的變量的值的一個索引,而他內部的規則是,把函數自身的本地變量放在最前面,把自身的父級函數中的變量放在其次,把再高一級函數中的變量放在更後面,以此類推直至全局對象爲止.當函數中須要查詢一個變量的值的時候,js解釋器會去做用域鏈去查找,從最前面的本地變量中先找,若是沒有找到對應的變量,則到下一級的鏈上找,一旦找到了變量,則再也不繼續.若是找到最後也沒找到須要的變量,則解釋器返回undefined. 閉包

var result=[];
function foo(){
    var i= 0;
    for (;i<3;i=i+1){
        result[i]=function(){
            alert(i)
        }
    }
};
foo();
result[0](); // 3
result[1](); // 3
result[2](); // 3



這段代碼中,程序員但願foo函數中的變量i被內部循環的函數使用,而且能分別得到他們的索引,而實際上,只能得到該變量最後保留的值,也就是說.閉包中所記錄的自由變量,只是對這個變量的一個引用,而非變量的值,當這個變量被改變了,閉包裏獲取到的變量值,也會被改變。上述其實就是一個閉包。

閉包能夠用在許多地方。它的最大用處有兩個,個是前面提到的能夠讀取函數內部的變量,另外一個就是讓這些變量的值始終保持在內存中 函數

相關文章
相關標籤/搜索