本文主要和大家分享JS中的閉包詳解,主要以程式碼的方式和大家講解,希望能幫助大家。
var n = 999; function f1() { console.log(n); } f1() // 999
JavaScript有兩種作用域:全域作用域和函數作用域。函數內部可以直接讀取全域變數。函數 f1 可以讀取全域變數 n。但是,在函數外部無法讀取函數內部宣告的變數。
function f1() { var n = 99; } console.log(n);
但是,有時我們需要在函數外部存取函數內部的變數;正常情況下,這是辦不到的,只有透過變通方法才能實現。那就是在函數的內部,再定義一個函數。
function f1() { var n = 999; var f2 = function() { console.log(n); } return f2; } var f = f1(); f();
上面程式碼中,函數f2就在函數f1內部 這時f1內部的所有局部變量,對f2都是可見的。但反過來不行,f2內部的局部變數 對f1就是不可見的。這就是JavaScript語言特有的」鍊式作用域」結構(chain scope) ,子物件會一級一級地向上尋找所有父物件的變數。所以,父物件的所有變量,對子物件都是可見的,反之則不成立。
既然f2可以讀取f1的局部變量, 那麼只要把f2作為回傳值, 我們不就可以在f1#外部讀取它的內部變數了。閉包就是函數f2,能夠讀取其他函數內部變數的函數。由於在JavaScript語言中,只有函數內部的子函數才能讀取內部變量, 因此可以把閉包簡單理解成「定義在一個函數內部的函數」。閉包最大的特點,就是它可以「記住」誕生的環境, 例如f2記住了它誕生的環境f1, 所以從f2可以得到f1的內部變數。在本質上,閉包就是將函數內部和函數外部連結起來的一座橋樑。即閉包的最大用處有兩個,一個是可以讀取函數內部的變量,另一個就是讓這些變量始終保持在內存中,即閉包可以使得它誕生環境一直存在;
相關推薦:
以上是JS中的閉包詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!