?1.什么閉包
釋放閉包
從以上看出:一般函數調用一次會把內部的數據進行清除--但是這種操作卻可以一起保留局部作用域的數據
// 優點:1、可以讀取函數內部的變量 ?2、讓這些變量始中存在局部作用域當中
2.閉包產生的兩種業務場景:防抖、節流
2.1防抖
舉例:寫個按鈕--寫個點擊事件
你狂點登錄---login函數一直被執行!--這樣子容易崩潰!
效果:點擊登錄--等待3s--實現登錄
2.1節流【好比王者榮耀的冷卻cd】
參考博主:前端性能優化之防抖&節流_前端防抖節流-CSDN博客
節流: n 秒內只執行一次事件,即使n 秒內事件重復觸發,也只有一次生效
應用場景:瀏覽器滾動事件、窗口大小的改變
舉例:監聽window的窗口大小
我只要不斷拉窗口--會一直觸發resize該事件!!--會造成大量計算
這么辦!【思路就是兩次觸發的時間間隔到了指定時間就執行--并且記錄第二次觸發的時間,否則不執行】
換句話說:【
1:多次觸發窗口---多次執行回調--多次獲取當前時間---只有滿足延遲(當前時間--上次觸發的事件>=延遲時間)--fn就會被執行---記錄當前時間時間作為上次觸發時間節點
2:多次觸發窗口---多次執行回調--多次獲取當前時間---不滿足延遲(當前時間--上次觸發的事件>=延遲時間)--fn就不會被執行----直到你觸發窗口的那次的當前時間剛好滿足延長時間】
完善代碼
/* 節流 */// 瀏覽器滾動事件、窗口大小的改變function thorttle(/* 需要進行節流處理的函數 */ fn, /* 延遲的時間 */ time) {// 記錄上一次事件執行的時間let lastTime = 0let i = 1return function () {i++// 獲取當前時間const nowTime = new Date().getTime()// cd剩余時間const remainTime = nowTime - lastTimeif (remainTime - time >= 0) {fn()lastTime = nowTimeconsole.log(i, 'i');}}}function _resize() {console.log("節流")}window.addEventListener("resize", thorttle(_resize, 2000))