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