一 概念區分
當看到function函式裡面巢狀function函式 就是閉包。
二 應用場景
1 先說正常的不同的function函式之間可以呼叫函式本身 例如
function a() function b() 2個函式是平級定義,但是無法訪問函式內部的變數name。
2 閉包就是,當想訪問函式內部的變數時或想把函式內部的變數拋到外面 ,就需要用閉包的寫法(一些函式裡面接收函式function引數並在內部執行)。
三 特別注意
1 閉包雖然寫法,是在主函式function內部定義閉包function函式,但是執行呼叫的時候還是在外面呼叫 (必須把閉包return 才能呼叫執行)。
例如: function a() } let result=a(); console.log(result.b());
----拿到了函式內部的變數name結果 ' sw'.
2 閉包由於執行呼叫都是在外面單獨進行,所以類似平級定義的2個function a ,b
故閉包裡面如果使用this. 訪問變數都是呼叫的函式外部的變數, 函式裡面的變數呼叫不需要通過this 來呼叫。
或者把外層函式 let that=this 賦值,然後通過that 訪問外層作用域私有變數。
3 閉包引用變數後會把變數儲存在記憶體中,直到使用完畢。所以注意及時清理,避免消耗記憶體。
4 如果把父函式當做物件使用,把閉包當做公用方法,把內部變數當做私有屬性,此時不要隨便改變父函式內部變數的值/直接使用。
四 具體說明
1 函式套函式主函式a , 裡面的函式b是閉包 ,可以訪問主函式中的變數 2 訪問函式內部的變數 (雖然 閉包函式在主函式裡面,但是閉包函式執行效果的時候 ,必須return出去 ,在外部執行 也就是說 在內部定義,但實際還是乙個外部函式!!!)
3 乙個函式想訪問另外乙個函式的內部變數,就是用閉包 。 但是閉包沒有this物件, 可以用主函式的 var that= this ,閉包裡面還可以呼叫主函式 a() 因為閉包就是乙個外部函式 比如分開呼叫的時候 就是 a() , b() ,可以互相呼叫的! 4 閉包裡面使用變數會在記憶體中,記得釋放 否則影響效能
五 經典例子
閉包的理解
閉包 是指有權訪問另乙個函式作用域中的變數的函式。建立閉包的常見方式就是在乙個函式內部建立另乙個函式 在函式createcomparisonfunction 中返回了乙個匿名函式,建立了乙個閉包。當匿名函式被返回時,其作用域鏈包含外部函式createcomparisonfunction的作用域鏈,這...
閉包的理解
function a return b b不能直接越過a在全域性作用 var c a c i 1var inner 定義 function outer outer 呼叫 inner 呼叫function outer x return inner var i outer 3 i 3 輸出6特點 1 函...
閉包的理解
function f1 alert a 報錯 a is not defined這裡的a是區域性變數,函式內部可以訪問外部變數,但是外部不可以訪問內部變數。因此會報錯 值得注意的是 函式內部宣告變數的時候,一定要使用var命令。如果不用的話,實際上是宣告了乙個全域性變數。function f1 ret...