作用域鏈和閉包

2021-10-05 13:53:28 字數 902 閱讀 6684

一.作用域鏈:scope chain

1. 作用域:

函式作用域[[scope]]:外部對內部可見;內部對外部不可見;內部優先

js中只有函式級別的作用域,沒有塊級別的作用域;換句話說,只有在進入或者退出函式的時候,作用域會發生變化

2. 執行環境(ec)和作用域鏈

執行環境,定義了執行期間可以訪問的變數和函式。

全域性執行環境:

global object(window)

從見到js**開始建立

到網頁關閉時銷毀

函式執行環境

activation object

從函式呼叫開始建立

到函式呼叫結束時銷毀

作用域[[scope]],每個函式都有

作用域是私有屬性,只能由js引擎訪問

作用域鏈,是ao和go構成的鏈

所謂執行環境,就是根據作用域鏈依次查詢變數和函式:找到即停;全部找完無果,報錯

作用域鏈每個函式都有

3. 生成作用域鏈: 

每個函式在定義(函式宣告\函式表示式)時會拷貝其父親函式的作用域鏈

在函式被呼叫時,生成ao然後將ao壓入作用域鏈的棧頂

4. 作用域鏈的應用:

效率:盡量少使用靠近上層的變數,多使用自己的區域性變數

重名,容易出錯:儘量減少不同層次函式使用相同的變數名;避免函式名與變數名一樣

函式退出以後ao是否一定被釋放?不一定

二. 閉包:函式的ao通過scope chain 相互連線起來,使得函式體內的變數都可以儲存在函式的ao,這樣的特性稱為「閉包」。

1.閉包的危險:

會造成原有ao不釋放,產生記憶體洩漏

2.閉包的應用:

實現公有變數

快取儲存結構

封裝,實現屬性私有化

模組化開發

作用域,閉包,作用域鏈

一,作用域 變數在宣告它的函式及該函式所巢狀的任意函式是有定義的 例var num 2 function fun fun 二,作用域鏈 多個函式巢狀在一起,多個作用域相互巢狀,這是作用域鏈 var num 1 function fun function fun2 fun1 fun2 fun 訪問原則...

作用域 作用域鏈 閉包

閉包概念中的一些專業名詞概念不清晰 作用域鏈 本質是乙個指向變數物件的指標列表。函式的作用域鏈在函式呼叫完成後即被銷毀。變數物件 全域性變數物件 js執行時一直存在 活動變數物件 區域性變數物件,函式執行完畢後銷毀 函式在呼叫時建立本地的活動物件加上函式定義時預建立的作用域鏈,形成乙個新的用於執行函...

作用域鏈 閉包

什麼是閉包?js語言的特點之一是 內部函式可以訪問全域性變數的值,而外部函式不能訪問內部變數的值。function test b test 輸出123反過來,如果a變數在函式b內部的話,test函式是訪問不到的。內層函式實際上可以訪問外部的所有變數的值,在函式內部取值的時候,優先從自己的函式塊中查詢...