上一節中粗略介紹了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 求解將哪些物品裝入揹包可使價值總和最大。整...