JavaScript:函式閉包
阿新 • • 發佈:2021-08-12
1、閉包的概念:
指有權訪問另一個函式作用域中的變數的函式,一般情況就是在一個函式中包含另一 個函式。
2、閉包的作用:
訪問函式內部變數、保持函式在環境中一直存在,不會被垃圾回收機制處理;
簡單地說:就是在函式的區域性範圍內宣告一個封閉的環境,此環境不會被垃圾回收探測到。保證了資料 的安全、唯一性
想了解閉包,首先要了解什麼是全域性變數,什麼是區域性變數
a = 10; // 全域性變數,宣告的時候可以不使用var function test1(){ b = 20; // 不適用var宣告的變數,就是全域性變數 var c = 30; // 用var宣告,並且在函式的內部。這樣的變數叫做區域性變數,有效範圍只能在其宣告的函式內部 console.log(c); } function test2(){ console.log(c); //c is not defined (c變數沒有定義) } test1(); test2();
需求:統計方法執行了多少次
var count = 0; // 總次數 function test1(){ count++; // 自增+1 } test1(); test1(); test1(); console.log( count );
誰都可以訪問count,所以count變數並不安全,因為是全域性變數。
如何才能安全呢?將count宣告為區域性變數
functiontest1(){ var count = 0; //區域性變數 return count++; //外部無法訪問count,只能通過return才能將count變數返回,並輸 出 } test1(); test1(); test1(); console.log( test1() ); // 每次呼叫方法,首先就是將變數還原為0
結果一直是0,因為每次呼叫test1(),方法體的第一句程式碼就是還原,無論曾經的值是多少。
突發奇想,如果在test1()函式裡面,再巢狀一個函式,js是支援函式巢狀的
function test1(){ var count = 0; //區域性變數 functionjia(){ return count++; } jia(); return count; } test1(); test1(); test1(); console.log( test1() ); // 每次呼叫方法,首先就是將變數還原為0
如果每次只調用test1()裡面的jia()就好了。ok,閉包幫你解決此問題!
function test1(){ var count = 0; //區域性變數 function jia(){ return count+=1; } return jia; } var fn = test1(); // fn => function jia(){return count+=1; } fn(); fn(); console.log( fn() ); // 每次呼叫方法,首先就是將變數還原為0
閉包是一種保護私有變數的機制,在函式執行時形成私有的作用域,保護裡面的私有變數不 受外界干擾。
直觀的說就是形成一個不銷燬的棧環境。
閉包的優點: 方便呼叫上下文中宣告的區域性變數 邏輯緊密,可以在一個函式中再建立個函式,避 免了傳參的問題
閉包的缺點: 因為使用閉包,可以使函式在執行完後不被銷燬,保留在記憶體中,如果大量使用閉 包就會造 成記憶體洩露,記憶體消耗很大