JavaScript中的閉包 JavaScript中的閉包 介紹 在大多數常用語言中,函數返回後,所有局部變數不再可訪問,因為堆棧幀已被銷毀。牢記這一點,閉包可以被看作是當函數返回時不會釋放的棧幀。 為什麼使用閉包 我有很多人問我為什麼要關閉。我會儘力解釋。 我遇到過閉包的場景是使用Tabular ...
JavaScript中的閉包
介紹
在大多數常用語言中,函數返回後,所有局部變數不再可訪問,因為堆棧幀已被銷毀。牢記這一點,閉包可以被看作是當函數返回時不會釋放的棧幀。
為什麼使用閉包
我有很多人問我為什麼要關閉。我會儘力解釋。
我遇到過閉包的場景是使用Tabular Controls,File Objects等。使用閉包我可以存儲我可以用於其他客戶端功能的頁面索引,行計數等。通過FSO,我可以保存文件路徑,計數等以備後用。它不僅適用於複雜的客戶端控制項。想想你的頁面有很多控制項並且你正在執行客戶端驗證的場景。每次你通過一個控制器
document.getElementById("controlname")
正在搜索整個頁面控制樹。這可以通過使用閉包並保存控制項一次來避免。可重用性是關閉的關鍵優勢。希望我已經說服了幾個人至少知道關閉。
使用代碼
看看下麵的功能:
現在我們以下麵的方式調用函數:
var say2 = sayHello("Sachin");
say2();
該函數sayHello()返回一個指向該函數的指針sayAlert()。
這裡,當你在另一個函數中聲明一個函數時,局部變數可以在從你調用的函數返回後保持可訪問。這在上面已經說明瞭。我們say2()
在從我們返回之後調用函數sayHello()。
請註意,我們調用的代碼引用了變數text,該變數是函數的局部變數sayHello()。
考慮下麵的功能:
這三個函數gAlertNumber(),gIncreaseNumber()並且gSetNumber(x)可以共用同一個閉包 - setupSomeGlobals()三個函數定義時的局部變數。
這可以通過一個接一個地調用函數來檢查。
嘗試下麵的順序:
如果我們setupSomeGlobals()再次調用,則會創建一個新的閉包(堆棧幀!)。老gAlertNumber,gIncreaseNumber,gSetNumber
變數被改寫新的具有新功能關閉。
概要
JavaScript中的閉包就像保留所有局部變數的副本一樣,就像退出函數時一樣。
可能最好認為閉包總是在函數的入口處創建,並且局部變數被添加到閉包中。
每次調用具有閉包的函數時都會保留一組新的局部變數(假設函數內部包含函數聲明,並且返回該函數的引用或者以某種方式為其保留外部引用)。