成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

前端JS面試中經常會被問到的幾個問題

開發 前端
本文不是討論新的 JavaScript 庫、常見的開發實踐或任何新的 ES6 函數,只是聊聊在面試中出現頻率比較高的的幾道面試題。

 本文不是討論新的 JavaScript 庫、常見的開發實踐或任何新的 ES6 函數,只是聊聊在面試中出現頻率比較高的的幾道面試題。

 

 

 

[[285702]]

 

問題1、事件的節流(throttle)與防抖(debounce)

有些瀏覽器事件可以在短時間內快速觸發多次,比如調整窗口大小或向下滾動頁面。例如,監聽頁面窗口滾動事件,并且用戶持續快速地向下滾動頁面,那么滾動事件可能在 3 秒內觸發數千次,這可能會導致一些嚴重的性能問題。那我們應該如何去避免這樣的問題,下面有兩種方法:

1、節流(throttle)

節流的主要思想在于:在某段時間內,不管你觸發了多少次回調,都只認第一次,并在計時結束時給予響應。

代碼示例:

 

  1. // fn是我們需要包裝的事件回調, interval是時間間隔的閾值 
  2. function throttle(fn, interval) { 
  3.   // last為上一次觸發回調的時間 
  4.   let last = 0 
  5.    
  6.   // 將throttle處理結果當作函數返回 
  7.   return function () { 
  8.       // 保留調用時的this上下文 
  9.       let context = this 
  10.       // 保留調用時傳入的參數 
  11.       let args = arguments 
  12.       // 記錄本次觸發回調的時間 
  13.       let now = +new Date() 
  14.        
  15.       // 判斷上次觸發的時間和本次觸發的時間差是否小于時間間隔的閾值 
  16.       if (now - last >= interval) { 
  17.       // 如果時間間隔大于我們設定的時間間隔閾值,則執行回調 
  18.           last = now; 
  19.           fn.apply(context, args); 
  20.       } 
  21.     } 
  22.  
  23. // 用throttle來包裝scroll的回調 
  24. const better_scroll = throttle(() => console.log('觸發了滾動事件'), 1000) 
  25.  
  26. document.addEventListener('scroll', better_scroll) 

2、防抖(Debounce)

防抖的主要思想在于:我會等你到底。在某段時間內,不管你觸發了多少次回調,我都只認最后一次。

代碼示例:

 

  1. // fn是我們需要包裝的事件回調, delay是每次推遲執行的等待時間 
  2. function debounce(fn, delay) { 
  3.   // 定時器 
  4.   let timer = null 
  5.    
  6.   // 將debounce處理結果當作函數返回 
  7.   return function () { 
  8.     // 保留調用時的this上下文 
  9.     let context = this 
  10.     // 保留調用時傳入的參數 
  11.     let args = arguments 
  12.  
  13.     // 每次事件被觸發時,都去清除之前的舊定時器 
  14.     if(timer) { 
  15.         clearTimeout(timer) 
  16.     } 
  17.     // 設立新定時器 
  18.     timer = setTimeout(function () { 
  19.       fn.apply(context, args) 
  20.     }, delay) 
  21.   } 
  22.  
  23. // 用debounce來包裝scroll的回調 
  24. const better_scroll = debounce(() => console.log('觸發了滾動事件'), 1000) 
  25.  
  26. document.addEventListener('scroll', better_scroll) 

3、節流和防抖的實際應用

在我們的應用中,單一的應用節流或者防抖都不是一個好主意。

場景:如果用戶的操作十分頻繁——他每次都不等 debounce 設置的 delay 時間結束就進行下一次操作,于是每次 debounce 都為該用戶重新生成定時器,回調函數被延遲了不計其數次。頻繁的延遲會導致用戶遲遲得不到響應,用戶同樣會產生“這個頁面卡死了”的觀感。

為了避免弄巧成拙,我們需要借力 throttle 的思想,打造一個“有底線”的 debounce——等你可以,但我有我的原則:delay 時間內,我可以為你重新生成定時器;但只要delay的時間到了,我必須要給用戶一個響應。這個節流與防抖結合的思路。

代碼示例:

 

  1. // fn是我們需要包裝的事件回調, delay是時間間隔的閾值 
  2. function throttle(fn, delay) { 
  3.   // last為上一次觸發回調的時間, timer是定時器 
  4.   let last = 0, timer = null 
  5.   // 將throttle處理結果當作函數返回 
  6.    
  7.   return function () {  
  8.     // 保留調用時的this上下文 
  9.     let context = this 
  10.     // 保留調用時傳入的參數 
  11.     let args = arguments 
  12.     // 記錄本次觸發回調的時間 
  13.     let now = +new Date() 
  14.      
  15.     // 判斷上次觸發的時間和本次觸發的時間差是否小于時間間隔的閾值 
  16.     if (now - last < delay) { 
  17.     // 如果時間間隔小于我們設定的時間間隔閾值,則為本次觸發操作設立一個新的定時器 
  18.        clearTimeout(timer) 
  19.        timer = setTimeout(function () { 
  20.           last = now 
  21.           fn.apply(context, args) 
  22.         }, delay) 
  23.     } else { 
  24.         // 如果時間間隔超出了我們設定的時間間隔閾值,那就不等了,無論如何要反饋給用戶一次響應 
  25.         last = now 
  26.         fn.apply(context, args) 
  27.     } 
  28.   } 
  29.  
  30. // 用新的throttle包裝scroll的回調 
  31. const better_scroll = throttle(() => console.log('觸發了滾動事件'), 1000) 
  32.  
  33. document.addEventListener('scroll', better_scroll) 

問題2、事件委托代理

傳統的事件綁定方式:

 

  1. <ul id="todo-app"
  2.   <li class="item">Walk the dog</li> 
  3.   <li class="item">Pay bills</li> 
  4.   <li class="item">Make dinner</li> 
  5.   <li class="item">Code for one hour</li> 
  6. </ul> 
  7.  
  8. document.addEventListener('DOMContentLoaded'function() { 
  9.   let app = document.getElementById('todo-app'); 
  10.   let itimes = app.getElementsByClassName('item'); 
  11.  
  12.   for (let item of items) { 
  13.     item.addEventListener('click'function(){ 
  14.       alert('you clicked on item: ' + item.innerHTML); 
  15.     }) 
  16.   } 
  17. }) 

雖然這在技術上是沒什么問題的,但問題是要將事件分別綁定到每個項。這對于目前 4 個元素來說,沒什么大問題,但是如果在待辦事項列表中添加了 10,000 項(他們可能有很多事情要做)怎么辦?然后,函數將創建 10,000 個獨立的事件偵聽器,并將每個事件監聽器綁定到 DOM ,這樣代碼執行的效率非常低下。如何高效的進行事件綁定:

基于事件委托的代碼示例:

 

  1. document.addEventListener('DOMContentLoaded'function() { 
  2.   let app = document.getElementById('todo-app'); 
  3.  
  4.   app.addEventListener('click'function(e) { 
  5.     if (e.target && e.target.nodeName === 'LI') { 
  6.       let item = e.target; 
  7.       alert('you clicked on item: ' + item.innerHTML) 
  8.     } 
  9.   }) 
  10. }) 

問題3、閉包的使用

閉包常常出現在面試中,以便面試官衡量你對 JS 的熟悉程度,以及你是否知道何時使用閉包。

閉包基本上是內部函數可以訪問其范圍之外的變量。 閉包可用于實現隱藏變量和創建函數工廠。

不正確的閉包應用:

 

  1. const arr = [10, 12, 15, 21]; 
  2. for (var i = 0; i < arr.length; i++) { 
  3.   setTimeout(function() { 
  4.     console.log('The index of this number is: ' + i); 
  5.   }, 3000); 

如果運行上面代碼,3 秒延遲后你會看到,實際上每次打印輸出是 4,而不是期望的 0,1,2,3 。

原因是因為 setTimeout 函數創建了一個可以訪問其外部作用域的函數(閉包),該作用域是包含索引 i 的循環。 經過 3 秒后,執行該函數并打印出 i 的值,該值在循環結束時為 4,因為它循環經過0,1,2,3,4并且循環最終停止在 4。

正確的閉包使用:

 

  1. //方法一: 
  2. const arr = [10, 12, 15, 21]; 
  3.  
  4. for (var i = 0; i < arr.length; i++) { 
  5.   setTimeout(function(i_local){ 
  6.     return function () { 
  7.       console.log('The index of this number is: ' + i_local); 
  8.     } 
  9.   }(i), 3000) 
  10.  
  11. //方法二: 
  12. const arr = [10, 12, 15, 21]; 
  13. for (let i = 0; i < arr.length; i++) { 
  14.   setTimeout(function() { 
  15.     console.log('The index of this number is: ' + i); 
  16.   }, 3000); 

 

責任編輯:華軒 來源: 今日頭條
相關推薦

2019-03-06 14:26:31

Javascript面試前端

2018-02-01 09:26:12

面試算法題程序員

2010-04-23 10:30:17

Oracle移植

2022-01-12 09:08:37

索引JavaReference對象

2019-02-21 10:49:51

Redis持久化恢復

2020-11-20 10:47:47

網絡面試開發

2010-04-06 13:07:45

Oracle數據庫

2021-12-29 22:29:10

JavaScript前端數組

2021-10-12 00:04:24

腳本備份MariDB

2010-06-04 19:31:25

遠程MySQL權限

2011-04-11 13:28:31

Oracle安裝

2011-04-11 13:25:59

Sybase安裝

2021-03-04 22:15:36

JavaScript編程開發

2022-06-07 07:37:40

線程進程開發

2020-05-14 08:13:56

JDK命令Java

2010-04-21 08:50:08

2013-05-06 15:42:49

2022-05-24 16:09:38

前端腳本

2009-09-07 14:39:14

2010-06-09 16:57:14

路由選擇協議
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美一区二区三区在线看 | 国产激情91久久精品导航 | 亚洲一区二区三区 | 精品少妇一区二区三区日产乱码 | 国产女人叫床高潮大片免费 | 激情五月婷婷丁香 | 日韩电影一区二区三区 | japan21xxxxhd美女 日本欧美国产在线 | 国产成人精品久久二区二区91 | 亚洲视频一区二区三区 | 日韩在线不卡视频 | 精品一区二区三区中文字幕 | 久久综合成人精品亚洲另类欧美 | 亚洲国产精品久久久久婷婷老年 | 国产三级大片 | a免费在线 | 久热精品在线播放 | 黄色一级在线播放 | 亚洲成人免费视频 | 日韩欧美一区二区三区 | 日韩不卡在线 | 日本中文字幕一区 | 色伊人| 综合色播 | 日韩和的一区二在线 | 久久国产亚洲 | 久久99精品国产 | 欧美色图综合网 | 国产日韩免费观看 | 国产精品爱久久久久久久 | 99爱国产 | 天天爱天天操 | 亚洲国产成人精品久久久国产成人一区 | 欧美久久久网站 | 91亚洲欧美 | 日韩三级在线 | 精品亚洲一区二区三区 | 精品精品视频 | 一区视频在线免费观看 | 五月天婷婷狠狠 | 欧美成人在线网站 |