標籤:rom 記憶體流失 public 效能 將不 技術 code 相同 回收
js的閉包
js的變數範圍:
var a=90; //定義一個全域變數 function test(){ a=123; //使用外層的 a變數 } test(); document.write("a="+a);
var a=90; //定義一個全域變數 function test(){ var a=123; //定義一個局部變數 } test(); document.write("a="+a);
a=90; //沒有var ,就會試著去找(父函數 的 a),如果找不到就建立 a function test(){ a=123; //沒有var ,就會試著去找(父函數/外層 的 a),如果找不到就建立 a } test(); document.write("a="+a);
1. js允許函數中有函數
2. 如果使用變數,如果該變數有var ,則表示建立全新的變數 ,如果該變數是直接寫在頁面,則我們認為是全域變數,否則是局部變數, 如果沒有帶var關鍵字, 則js引擎會這樣處理: 首先到父函數去找有沒有該變數,如果有,則使用,如果沒有則建立之.
function f1(){ //var n=999;//局部變數 n=999;//全域變數 } f1(); alert(n);
3. 上面的代碼說明,如果在一個函數中,直接使用 比如n=900; 相當於建立了一個全域變數.
js中如何解決從外部讀取內建函式的局部變數
function test1(){ var n=90;//布局變數 }alert(n) //錯誤
解決方案->閉包
function test1(){ var n=90; //test1函數的內建函式,可以訪問 var n funciton test2(){ window.alert(n++); } //把內建函式test2返回外部調用者 return test2;}
var res=test1();//調用test1 ,返回 test2函數這時res就是test1內建函式 test2別名
res();
閉包: 你可以這樣理解 : test2()實現閉包
u 閉包的主要用處是
1. 把局部變數儲存在記憶體中,不讓記憶體回收機制,將其回收.
2. 讓外部去訪問內建函式的布局變數.
有時希望n能夠累加,不希望記憶體回收機制將其回收,這時候用到了閉包
閉包
※ 使用閉包的注意點
1)由於閉包使得函數中的變數被儲存在記憶體中,記憶體消耗很大,所以不能濫用閉包,否則造成網頁效能問題,在ie瀏覽器中可能導致記憶體流失。解決方案,在退出函數之前,將不使用的局部變數全部刪除。
2)閉包會在父函數外部,改變函數內部的值。所以,如果你把父函數當做對象(object)使用,把閉包當做它的公用方法(Public Method),把內部變數當做它的私人屬性(private value),這時一定要小心,不要隨便改變父函數內部變數的值。
※ js中函數名不能重複
- 在不同檔案中,可以有相同的函數名.
- 在不同父函數(類), 即使在同一個頁面,可以有相同函數,比如下面代碼abc.html
javaScript的閉包 js變數範圍