Javascript閉包是一種高級特性,經常在函數式編程中使用。它允許函數訪問其定義范圍之外的變量,并且始終保留對這些變量的引用,即使在函數調用后,他們也不會被垃圾回收。這使得閉包成為一種非常有用的編程模式,可以避免全局變量的使用。接下來,我們將深入探討javascript閉包是如何工作的,并了解一些典型的應用。
function counter() { var count = 0; return function() { count++; console.log(count); } } var c = counter(); c(); // 輸出1 c(); // 輸出2 c(); // 輸出3
在上面的代碼中,我們定義了一個counter函數,該函數返回另一個函數,該函數引用和更新count變量。當我們調用counter()時,它返回一個新的函數,并將該函數存儲在變量c中。每次調用c()時,這個內部函數將增加count變量的值,并將它打印到控制臺上。
由于閉包允許內部函數訪問其定義范圍之外的變量,因此它們通常用于創建私有變量。例如,考慮下面的對象:
function Person(name) { var age = 0; this.getName = function() { return name; }; this.getAge = function() { return age; }; this.setAge = function(newAge) { age = newAge; }; } var p = new Person("Alice"); console.log(p.getName()); // 輸出 "Alice" console.log(p.getAge()); // 輸出 0 p.setAge(28); console.log(p.getAge()); // 輸出 28 console.log(p.age); // 輸出 undefined
在這個例子中,我們創建了一個Person構造函數,它接受一個名稱參數并創建一個私有變量age。使用閉包,我們可以安全地訪問和更新這個變量,而不會讓外部信息暴露出來。當我們創建一個新的Person對象時,它將返回包含私有函數名稱、獲取年齡和設置年齡的對象,這些函數都可以訪問age變量。
閉包可以用于模仿私有方法。在Javascript中,我們沒有類特性,但我們可以使用函數和閉包來模擬。
var calc = (function() { var total = 0; function add(num) { total += num; } function subtract(num) { total -= num; } function getTotal() { return total; } return { add: add, subtract: subtract, getTotal: getTotal }; })(); calc.add(5); calc.subtract(2); console.log(calc.getTotal()); // 輸出 3
在這個例子中,我們創建了一個自調用函數,在其中定義了一些私有變量和私有函數。然后,我們創建了一個包含公共函數的對象,并返回這個對象。這個對象可以訪問和更新私有變量,并提供了一個封裝函數接口,以便外部可以使用。
總的來說,Javascript閉包是一個非常有用的技術,可以幫助我們更好地組織代碼,并幫助我們避免全局變量的使用。它們可以用于模擬私有變量和方法,存儲狀態等。