閉包這個概念一直困擾這我,很多時候背了,過段時間又記不住了。之是以這樣是因為自己并沒有真正了解什麼是閉包。很多時候你覺得一個概念很複雜記不住,很有可能是你對這個概念了解錯了。
很多人會說閉包會造成記憶體洩露,其實這是錯誤的。之是以會造成記憶體洩露是因為IE浏覽器造成的,并不是所有浏覽器都會這樣。通常之是以會造成記憶體洩露,是因為浏覽器儲存了沒有被引用的變量,但是閉包的本地變量是被引用和使用的,就不存在記憶體洩露的問題。
我們來看一下閉包的定義:
「函數」和「函數内部能通路到的變量」(也叫環境)的總和,就是一個閉包。
防抖和節流是閉包的典型應用場景,我們來看一下代碼:
防抖:
function debounce(fn, delay) {
var timer = null;
return function() {
if(timer) {
clearTimeout(timer);
}
timer = setTimeout(() => {
fn&&fn();
}, delay);
}
}
節流:
function throttle(fn, delay) {
var timer = null;
return function() {
if(!timer) {
timer = setTimeout(() => {
timer = null
fn&&fn()
}, delay);
}
}
}
防抖的業務場景一般是在實時輸入檢索,節流的業務場景一般為高頻事件回調,比如圖檔懶加載