天天看點

js閉包原理及其應用場景

閉包這個概念一直困擾這我,很多時候背了,過段時間又記不住了。之是以這樣是因為自己并沒有真正了解什麼是閉包。很多時候你覺得一個概念很複雜記不住,很有可能是你對這個概念了解錯了。

很多人會說閉包會造成記憶體洩露,其實這是錯誤的。之是以會造成記憶體洩露是因為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);
		}
	}
}
           

防抖的業務場景一般是在實時輸入檢索,節流的業務場景一般為高頻事件回調,比如圖檔懶加載

繼續閱讀