js閉包之應用場景
閉包的解釋
一個擁有許多變量和綁定了這些變量的環境的表達式(通常是一個函數),因而這些變量也是該表達式的一部分。閉包是指有權訪問另一個函數作用域的變量的函數
在javascript中,只有函數內部的子函數才能讀取局部變量,所以說,閉包可以簡單理解成“定義在一個函數內部的函數“。所以,在本質上,閉包是將函數內部和函數外部連接起來的橋梁。
閉包的特點:
1) 作為一個函數變量的一個引用,當函數返回時,其處於激活狀態。
2) 一個閉包就是當一個函數返回時,一個沒有釋放資源的棧區。
簡單的說,javascript允許使用內部函數---即函數定義和函數表達式位於另一個函數的函數體內。而且,這些內部函數可以訪問它們所在的外部函數中聲明的所有局部變量、參數和聲明的其他內部函數。當其中一個這樣的內部函數在包含它們的外部函數之外被調用時,就會形成閉包。
閉包應用場景
1.setTimeout
setTimeout(func,time)
這裏的func不能帶參數,解決這個問題需要用閉包
function func(param) { return function() { alert(param); } } var f = func(1) setTimeout(f, 1000);
2.代替全局變量
//閉包,test2是局部變量,這是閉包的目的 //我們經常在小範圍使用全局變量,這個時候就可以使用閉包來代替。 (function(){ var test2=222; function outer(){ alert(test2); }function test(){ alert("測試閉包:"+test2); } outer(); //222 test(); //測試閉包:222 } )(); alert(test2); //未定義,這裏就訪問不到test2
3.為節點循環綁定click事件,在事件函數中使用當次循環的值或節點,而不是最後一次循環的值或節點
4.創建特權方法用於訪問控制
使用閉包的註意點
(1)由於閉包會使得函數中的變量都被保存在內存中,內存消耗很大,所以不能濫用閉包,否則會造成網頁的性能問題,在IE中可能導致內存泄露。解決方法是,在退出函數之前,將不使用的局部變量全部刪除。
(2)閉包會在父函數外部,改變父函數內部變量的值。所以,如果你把父函數當作對象(object)使用,把閉包當作它的公用方法(Public Method),把內部變量當作它的私有屬性(private value),這時一定要小心,不要隨便改變父函數內部變量的值。
js閉包之應用場景