JS學習之閉包精講

2021-09-19 23:22:34 字數 2087 閱讀 4791

上一節中粗略介紹了js中的閉包概念。這節則需要講解閉包在**中的應用。

讓我們先看個例子。

function

test()

}return arr;

}var myarr =

test()

;for

(var j =

0;j <

10;j ++

)

你覺得輸出是0 1 2 3 4 5 6 7 8 9;

亦或是10 10 10 10 10 10 10 10 10 10;

正確答案其實是後者 ,為什麼呢?

講解:

通過return arr;使得函式test和arr形成閉包。

為什麼答案是10,而不是9?

因為test函式首先進行,在for迴圈中,arr[i] = function語句中後面的函式不進行,系統不不會確認賦值的函式體是什麼,只進行i的自增,所以直到呼叫函式時,i的值為10。

為什麼答案都是10,而不進行新的迴圈?

因為每次呼叫test函式時,訪問的i都是test的ao裡的i值。所以都為10。

那麼如何讓函式輸出為0 1 2 3 4 5 6 7 8 9呢?

這個時候我們就可以用立即執行函式來儲存索引值。如下:

function

test()

}(i))}

return arr;

}var myarr =

test()

;for

(var j =

0;j <

10;j ++

)

讓我們再來看一道題:

>

>

ali>

>

ali>

>

ali>

>

ali>

ul>

使用原生js,給每個li元素繫結乙個click事件,輸出他們的順序。

像上面的題一樣:

這道題也出現了閉包問題。

function

test()

}}test()

;

你發現上面**的問題了嗎?

onclick 將函式儲存在了外部。所以這樣不能得到正確的結果。

向上面一樣,在for迴圈裡需要使用立即執行函式。

再來看一道題:

var f=

(functionf(

),functiong(

))()

; console.

log(

typeof f)

;

輸出結果為:number

在這道題中『,』運算子後的語句被賦給變數f,值為2,所以輸出型別為number。

下面有一道關於立即執行函式的題:

var x =1;

if(functionf(

))console.

log(x)

;

這道題乍一看會報錯,但是仔細分析還是存在結果。

(function f(){})是乙個立即執行函式,變數f被忽略,相當於乙個未宣告的變數,而typeof可以執行為宣告的變數,值為undefined,所以結果為:

1undefined

閉包的用處:

保護函式內的變數安全 ,實現封裝,防止變數流入其他環境發生命名衝突

在記憶體中維持乙個變數,可以做快取(但使用多了同時也是一項缺點,消耗記憶體)

匿名自執行函式可以減少記憶體消耗

需要注意的是:

其中一點上面已經有體現了,就是被引用的私有變數不能被銷毀,增大了記憶體消耗,造成記憶體洩漏,解決方法是可以在使用完變數後手動為它賦值為null;

其次由於閉包涉及跨域訪問,所以會導致效能損失,我們可以通過把跨作用域變數儲存在區域性變數中,然後直接訪問區域性變數,來減輕對執行速度的影響

Python閉包精講

1.什麼是閉包?閉包就是乙個函式 2.如何建立閉包?1 要有函式的巢狀 要有外部函式,內部函式 2 內部函式要使用到外部函式的變數 3 外部函式必須有返回值,返回內部函式名 3.如何使用閉包?引數的傳遞是從外向內的 def funout num1 def funin num2 return num2...

JS學習 閉包

function eater push function myfood return obj var eater1 eater eater1.push banana eater1.eat 函式eat 和 push 共用乙個閉包 food立即執行函式,執行完會馬上把函式釋放,針對初始化功能的函式。va...

揹包精講之 01揹包

了解01揹包時應該注意01揹包在問法上的差別 初始化分兩種情況 1 如果揹包要求正好裝滿則初始化 f 0 0,f 1 w inf 2 如果不需要正好裝滿 f 0 v 0 題目 有n 件物品和乙個容量為 v的揹包。第 i件物品的費用是 c i 價值是 w i 求解將哪些物品裝入揹包可使價值總和最大。整...