關於js的閉包

2021-09-29 16:54:51 字數 1407 閱讀 7690

要理解上面的問題,首先要理解清楚幾個概念:(來自 閉包裡的微觀世界)

區別就是值型別變數是可以直接訪問棧(stack)中的值:

接下來的內容就是關於閉包的微觀世界

function

a()

return

b; }

var c=a(); //

函式a執行後返回函式b,並將函式b賦給c

c();//

輸出 1

本來這個地方變數i是定義在函式a中,並不能被函式a的外部所訪問,但是這個地方因為在a中定義了乙個函式b,函式b中有對變數i的引用,因此當b被a返回後,變數c獲得了對函式a中函式b的引用,因此i不會被gc**,而是存在記憶體當中。

當在乙個函式a裡面定義另外乙個函式b,函式b有對函式a中變數的引用,當函式a執行並返回函式b,將b賦給變數c時,這樣就存在相互之間的引用關係,並形成了大家經常見到的閉包

我們進一步的分析:這一部分的內容包含了作用域作用域鏈部分的內容.

依然拿上面的例子來分析:

下面用2張圖來表示整個過程:

圖一展示了函式a定義過程是如何建立作用域鏈的

圖二展示了函式a執行過程產生的活動物件(call object)

在這其中有個非常重要的內容就是函式的作用域是在定義函式的時候就已經確定,而不是在執行的時候確定。

理解了上面這些,再回到開頭的例子:

f1指向的是記憶體空間中乙個匿名函式,並且在記憶體裡面引用沒有釋放(i的值一直存在),f2指向的是記憶體空間中另乙個匿名函式,注意,這兩個匿名函式在記憶體的不同位置,不是同乙個,他們有各自的作用域;所以會是上述結果。

function

foo()

}var f1=foo();

var f2=foo();console.log(f1instanceof f2);//

falsef1();//

0 f1();//

1 f2();//

0

關於js閉包的誤區

一直以為js的閉包只是內部函式儲存了乙份外部函式的變數值副本,但是以下 打破了我的認識 function createfunctions return result var funcs createfunctions for var i 0 i 10 i 執行結果是10個10 而不是0 9 看了js...

關於JS閉包的理解

閉包要解決的問題是 乙個函式可以擁有私有變數,並且外部可以通過閉包訪問該私有變數 閉包是一種保護私有變數的機制,在函式執行時形成私有的作用域,保護裡面的私有變數不受外界干擾。直觀的說就是形成乙個不銷毀的棧環境。計數器例項 區域性變數計數。p button onclick myfunction 1 b...

關於js閉包的誤區

一直以為js的閉包只是內部函式儲存了乙份外部函式的變數值副本,但是以下 打破了我的認識 function createfunctions return result var funcs createfunctions for var i 0 i 10 i 執行結果是10個10 而不是0 9 看了js...