對於閉包的理解
阿新 • • 發佈:2021-11-08
何為閉包
一個函式和對其周圍狀態的引用捆綁在一起(或者說函式被引用包圍),這樣的組合就是閉包(closure)。也就是說,閉包讓你可以在一個內層函式中訪問到其外層函式的作用域。在 JavaScript 中,每當建立一個函式,閉包就會在函式建立的同時被創建出來。
作用域
function outer () { const outerName = "is Outer var"; // outerName 是一個被 outer 建立的區域性變數 function inner () { // inner() 是outer內部的函式,一個閉包 alert(outerName); // 使用了父函式中宣告的變數 } inner(); } outer();
拷貝這段程式碼到瀏覽器控制檯,發現會彈出outerName
的內容。以上寫法很常見。inner() 沒有自己的區域性變數。然而,因為它可以訪問到外部函式的變數,所以 inner()
可以使用父函式 outer()
中宣告的變數 outerName
。巢狀函式可訪問聲明於它們外部作用域的變數。
再看一段例子
閉包
function outer() { const outerName = "is Outer var2"; function inner() { alert(outerName); } return inner; } const myFn = outer(); myFn();
執行這段程式碼效果和之前那段程式碼效果完成一樣,也開業彈出outerName
的內容。我們發現不同點在於。outer
方法會返回inner
方法,
呼叫myFn
時還是可以訪問到outer
作用域塊內的outerName
這就是閉包。
閉包私有方法
再看一段例子
function outer() { let outerName = "is Outer var"; function inner(arg) { outerName = outerName + arg console.log(outerName) } return inner; } const myFn1 = outer(); myFn1(100) const myFn2 = outer(); myFn2(200) // is Outer var100 // is Outer var200
執行程式碼。發現 myFn1
和 myFn2
執行時、各自呼叫 inner
中的 outerName
是相互獨立的,每個閉包都是引用自己詞法作用域內的變數 outerName。