JS閉包原理分析

2021-10-03 03:08:01 字數 1039 閱讀 3464

js閉包原理分析

閉包是指有權訪問另乙個函式作用域中的變數的函式。在乙個函式a內部返回另乙個函式b,並且函式b裡面使用者a函式內部的私有變數,此外在函式a外面定義乙個變數接收函式b,這樣就形成了閉包。

比如在一棟房子裡面有很多個小房間,你手上通過拿著乙個小房間的位址(***棟001房),那麼通過小房間的位址就可以找到這棟房子,進入裡面。

函式都有自己的執行環境,該環境定義了變數或者函式訪問資料的許可權。js 在執行的時候,會為每乙個執行函式分配記憶體空間,我們稱這個空間為作用域物件(scope object)。當呼叫函式時,函式中分配的本地變數會被儲存在這個作用域物件中。當函式執行了之後,該空間會被銷毀,該空間內的變數也會被銷毀。

函式作用域物件是按順序訪問的,最先能夠訪問的是當前函式的作用域,如果訪問的變數在當前作用域沒有,會訪問上一層作用域,直到找到全域性作用域(global)物件。如果訪問到全域性作用域也沒有這個物件,會丟擲referenceerror的異常。這就是所謂的作用域鏈(scope chian)。

閉包之所以能夠訪問到上一層函式中的區域性變數,是因為當變數**獲之後,即使上一層函式呼叫完畢出棧了,但是它的作用域物件沒有被銷毀,所以仍然能夠被閉包訪問。

在函式內部返回乙個函式,並且在外部定義乙個全域性變數接收這個返回的函式,該變數儲存的實際上是返回的函式的儲存位址,那麼函式fn2的執行空間不會被銷毀,因為在外面有變數儲存函式fn2執行空間裡面返回函式的位址,通過該位址可以找到函式fn2的執行空間,所以可以在外部訪問到函式fn2裡面的變數i。

以上就是閉包的基本原理。

js閉包函式原理

變數作用域 全域性變數和區域性變數 問題 函式外部無法讀取內部 宣告也會體現是否全域性在函式內或者外部 1.閉包 就是指能夠讀取其他函式內部變數的函式。在js中,只有函式內部的子函式才能讀取區域性變數,所以閉包可以理解成 定義在乙個函式內部的函式 巢狀函式 本質上,閉包是將函式內部和外部連線起來的橋...

JavaScript閉包原理分析

寫了幾個小例子揭示js中閉包的本質,適合自己執行後分析。html檔案 01 2345 什麼是閉包 js function 解決方案一 借用dom元素的屬性儲存序號i for var i 0 i 6 i 解決方案二 利用iife將i作為引數傳遞給內部函式 for var i 0 i 6 i i 錯誤方...

JS 閉包的實現原理

函式都有自己的執行環境,該環境定義了變數或者函式訪問資料的許可權,當離開執行環境後,該環境內的變數會被銷毀。function add console.log a referenceerror a is not defined 上例a在 add 函式的作用域內,能夠訪問,離開作用域後,就無法訪問了。那...