什麼是閉包,為什麼要用他?閉包是能夠訪問其他函式作用域的函式。
我們來分析下句子成分(語文大神),閉包是函式,js函式的作用域分為全域性作用域,區域性作用域,eval作用域,並沒有塊級作用域形象的講,每個函式都是乙個小黑屋,能在小黑屋裡看到外面的的世界,可是外界不知道小黑屋裡是啥情況,如何開啟門從小黑屋出來呢,就用到了閉包。
有幾個概念必須要了解
作用域和作用域鏈
原來作用域和上下文作用域是兩個不同的概念,本質上來說,作用域是基於函式的,上下文是基於物件的,作用域規定了當前執行環境對變數的訪問許可權,這是js中最重要乙個概念。
作用域鏈(詞法作用域):當查詢變數的時候,會先從變數本身查起,如果本身沒有就從父級物件上查詢,一直查到全域性上下文變數物件,若無返回undefine,這個由多個執行上下文物件構成的鍊錶就叫做作用域鏈。
閉包的特點:
1、函式內再巢狀函式
2、內部函式可以引用外層的引數和變數。
3、引數和變數不會被垃圾**機制**
閉包的使用注意事項
函式會使得函式中的變數儲存在記憶體中,會占用記憶體,所以只有在必要的時候使用它,如果不用的話要將他為null
mmp show me the code
functionexample();
return
example2;
}
var result=example(); result(); //
1
在自己函式內部定義乙個函式,然後再將函式值return回去
functionexample1()
function
example2()
return
example2;
}
var result=example1(); result(); // 1 add(); result(); // 2解析:result();
函式定義了乙個變數 ,呼叫時直接返回乙個函式,example2裡面沒有n,沿著作用域鏈向上找到了n=1;
add();執行後n的值為2;
然後example2向上查詢時n就變成了2;
小結:整理了一下午,到處查資料,原來**越深才知道知道的越少,這些東西很重要,檢驗你是否學好可以試著給別人講懂。
由於自身能力有限,有些錯誤在所難免,歡迎指正,榮幸之至。
說說js閉包
js閉包涉及到作用域,js的作用域有兩種,全域性變數和區域性變數,全家變數就是在函式外宣告的,區域性變數是在函式內宣告的,函式內部可以直接讀取全域性變數 但是函式外部自然無法讀取函式內的區域性變數 函式內部宣告變數的時候,要用var不然就是個全域性變數 有時候需要得到函式內的區域性變數 濫用閉包會可...
JS閉包理解
下圖例項 body ul li 1 li li 2 li li 3 li ul body html script vara document.getelementsbytagname li for vari 0 i a.length i i 如何從外部讀取區域性變數 functionvisitinn...
JS基礎 閉包
注 自由變數是既不是在本地宣告又不作為引數傳遞的一類變數。function a return b var b a b hello closure 定義乙個函式a a中定義了函式b a中返回b 執行a 把a的返回結果賦值給變數b 執行b 閉包會在父函式外部,改變父函式內部變數的值。所以,如果你把父函式...