1. 程式人生 > 其它 >js高階-作用域和閉包

js高階-作用域和閉包

作用域(scope):
用於確定在何處以及如何查詢變數的一套規則。也可以說是變數和函式能作用的範圍,一塊程式碼區域。

如果查詢目的是賦值,js會使用LSH查詢;如果目的是獲取值,會使用RSH查詢。
賦值操作會導致LHS,=操作或呼叫函式時傳入引數的操作會導致RHS查詢。不成功的RSH查詢會導致ReferenceError異常,不成功的LSH會隱士建立一個全域性變數(非嚴格模式下),或者丟擲ReferenceError異常(嚴格模式)。

用途:
隔離變數,不同作用域下的同名變數不會衝突

作用域巢狀:
當一個函式或塊巢狀另一個函式或塊的時候,就發生了作用於巢狀。
查詢巢狀作用於鏈規則:js引擎查詢變數的時候的會先從當前作用於查詢,如找不到則從上一級作用於查詢,當抵達最外層全域性作用於時,無論找到還是找不到都會停止。

作用域鏈:
發生作用域巢狀時,由多個作用域變數物件構成的連結串列,叫作作用域鏈。

作用域是由書寫程式碼時函式宣告的位置決定的,

閉包:
函式在當前作用域之外執行時,這是就產生了閉包。內部函式持有外部函式作用域的引用,這個引用就是閉包。

一般情況下,當一個函式被呼叫後,其內部的整個作用域都會被銷燬。因為引擎有垃圾回收器來釋放不再使用的空間。但是閉包可以阻止這件事情發生。

作用:
延長區域性變數的生命週期

閉包應用:
迴圈遍歷加監聽
模組化: 封裝一些資料以及操作資料的函式, 向外暴露一些行為
JS框架(jQuery)大量使用了閉包

缺點:
變數佔用記憶體的時間可能會過長
可能導致記憶體洩露
解決:
及時釋放 : f = null; //讓內部函式物件成為垃圾物件