JS閉包解析

2022-09-12 08:57:11 字數 1605 閱讀 6024

js作用域傳送門

function f() 

}var fn = f();

var a = 200;

fn(); // 輸出100

呼叫fn函式,輸出a的值,fn中並沒有定義a,所以會向上找a,在f函式的作用域中,有a,值為100。所以就會輸出100,並不會輸出200。全域性作用域中的a和f函式作用域中的a並不相同。這也體現出了閉包的乙個好處:不會造成全域性變數汙染

function f() 

}var fn = f();

function f2(fn)

f2(fn);// 輸出100

呼叫f2函式,傳入fn函式,呼叫fn函式,輸出a為100。

var arr = ;

var i;

for (i = 0; i < 3; i++)

}console.log(arr[0]()); // 輸出2

for迴圈3次,i的值從0變為2,arr這個陣列中也新增了3個函式。

當呼叫arr[0]函式時,for迴圈已經結束了,這時候i的值已經為2了,所以arr[0]函式取到的值為2。

var arr = ;

var i;

for (i = 0; i < 3; i++)

})(i);

}console.log(arr[0]()); // 輸出0

這裡,使用自執行匿名函式構造成乙個獨立作用域。每一次for迴圈的時候,都會執行這個匿名函式,並生成 乙個匿名函式作用域。

比如第一次迴圈的時候,i = 0,將i作為引數傳入匿名函式中,這樣i的值就被儲存在匿名函式作用域中。當呼叫arr[0]函式時,arr[0]就會取到匿名函式中的i的值。

// 閉包實際應用中主要是封裝變數,收斂許可權

function isfirstload() else

}}var firstload = isfirstload();

firstload(1); // 返回true

firstload(1); // 返回false

firstload(2); // 返回true

目前主流瀏覽器採用的垃圾收集策略均為標記清除。當變數進入環境(比如,定義乙個變數)時,就將這個變數標記為『進入環境』,當變數離開環境時,就會被標記為『離開環境』,就會被銷毀。在剛才的閉包實際應用中_list變數一直被isfirstload的返回函式引用著,不會隨著isfirstload的呼叫結束而銷毀。所以_list變數會一直存在記憶體中。因此不能濫用閉包,否則就會造成網頁效能問題,甚至記憶體洩漏。當我們不需要這些變數的時候,我們可以把這些變數的值賦值為null

js 閉包經典問題超詳細解析

閉包經典問題如下 function test return arr var myarr test for var j 0 j 10 j 本意是想列印1到10,卻列印了10個10,為什麼呢?詳細解釋過程如下 但此時匿名函式的作用域鏈為 scope scopechain 0 test ao scopec...

說說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...