日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

面試中要注意的 3 個 JavaScript 問題

瀏覽:17日期:2023-11-14 17:03:27

面試中要注意的 3 個 JavaScript 問題

JavaScript 是 所有現(xiàn)代瀏覽器 的官方語言。因此,各種語言的開發(fā)者面試中都會遇到 JavaScript 問題。

本文不講最新的 JavaScript 庫,通用開發(fā)實踐,或任何新的 ES6 函數(shù) 。而是講講面試中經(jīng)常出現(xiàn)的 3 個 JavaScript 問題。我問過這些問題,我的朋友說他們也問。

當(dāng)然不是說你在準(zhǔn)備 JavaScript 面試時只要學(xué)習(xí)這 3 個問題 —— 你還 有 很多 途徑 去更好的準(zhǔn)備即將到來的面試 —— 但面試官很有可能通過下面 3 個問題來判斷你了解和掌握 JavaScript 和 DOM 的情況。

讓我們開始吧!注意下面的例子中我們使用原生 JavaScript, 因為面試官通常想考查你在不借助庫(例如 jQuery)的幫助時掌握 JavaScript 和 DOM 的情況。

問題 #1: 事件代理

創(chuàng)建應(yīng)用時,有時需要給頁面中的按鈕,文字,或圖片添加事件監(jiān)聽器,當(dāng)用戶與這些元素交互時觸發(fā)某些操作。

我們以一個簡單的代辦事項列表為例,面試官會告訴你,他們希望在用戶點擊列表中某一項時觸發(fā)一個動作。并讓你用 JavaScript 根據(jù)下面的 HTML 代碼實現(xiàn)這個功能:

<ul id='todo-app'> <li class='item'>Walk the dog</li> <li class='item'>Pay bills</li> <li class='item'>Make dinner</li> <li class='item'>Code for one hour</li></ul>

你可能會像下面的代碼一樣給元素添加事件監(jiān)聽器:

document.addEventListener(’DOMContentLoaded’, function() { let app = document.getElementById(’todo-app’); let items = app.getElementsByClassName(’item’); // 給每個列表項添加事件監(jiān)聽器 for (let item of items) { item.addEventListener(’click’, function() { alert(’you clicked on item: ’ + item.innerHTML); }); }});

當(dāng)然上面的代碼能完成面試官的需求,問題是每個列表項都會加上一個事件監(jiān)聽器。當(dāng)列表只有 4 項時沒有問題,但如果有人給代辦事項列表新增了 10,000 個事項呢(他們也許有一大堆事情要做)?那時函數(shù)會創(chuàng)建 10,000 個事件監(jiān)聽器,然后把它們都添加到 DOM 上。這樣 效率 非常低。

面試中最好首先問一下面試官用戶最多可以添加多少個代辦事項。如果永遠不會超過 10 個,那上面的代碼運行起來就沒有問題。但如果用戶輸入待辦事項的數(shù)量沒有上限,那你就得換一個更高效的解決方案。

如果應(yīng)用有上百個事件監(jiān)聽器,更高效的解決方案是給最外層的容器添加 一個 事件監(jiān)聽器,當(dāng)用戶真正點擊的時候再去獲取實際被點擊的代辦事項。這被稱為 事件代理 ,這比給每個代辦事項都單獨添加事件監(jiān)聽器更高效。

下面是事件代理的代碼:

document.addEventListener(’DOMContentLoaded’, function() { let app = document.getElementById(’todo-app’); // 給容器添加事件監(jiān)聽器 app.addEventListener(’click’, function(e) { if (e.target && e.target.nodeName === ’LI’) { let item = e.target; alert(’you clicked on item: ’ + item.innerHTML); } });}); 問題 #2: 在循環(huán)中使用閉包

面試中經(jīng)常會問到閉包,因為面試官能通過這個問題的回答判斷你對語言的熟悉程度,以及考察你是否知道什么時候使用閉包。

閉包就是能訪問作用域外部變量的 內(nèi)部函數(shù) 。閉包能用來實現(xiàn) 私有化 和創(chuàng)建 工廠函數(shù) 等作用。關(guān)于閉包的常見面試題是這樣的:

寫一個函數(shù),循環(huán)一個整數(shù)數(shù)組,延遲 3 秒打印這個數(shù)組中每個元素的索引。

這個問題常見(不正確)的實現(xiàn)是這樣:

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

如果你運行這段函數(shù),你會發(fā)現(xiàn) 3 秒之后每次都打印的是 4 ,而不是預(yù)期的 0, 1, 2, 3

為了正確的找到出現(xiàn)這種情況的原因,你需要理解 JavaScript 是如何運行這段代碼的,這也是面試官想要考察你的地方。

原因是 setTimeout 函數(shù)創(chuàng)建了一個訪問外部作用域的函數(shù)(閉包),就是包含索引 i 的那個循環(huán)。3 秒之后,函數(shù)開始執(zhí)行打印 i 的值,而此時循環(huán)也結(jié)束了, i 的值已經(jīng)是 4。因為循環(huán)遍歷 0, 1, 2, 3, 4 后最終停在了 4。

實際上有 好幾種方法 能 正確 解決這個問題。這里有兩個:

const arr = [10, 12, 15, 21];for (var i = 0; i < arr.length; i++) { // 給每個函數(shù)傳入變量 i 讓其能訪問正確的索引 setTimeout(function(i_local) { return function() { console.log(’The index of this number is: ’ + i_local); } }(i), 3000);}

const arr = [10, 12, 15, 21];for (let i = 0; i < arr.length; i++) { // 使用 ES6 中的 let 關(guān)鍵字,它會在函數(shù)調(diào)用時創(chuàng)建一個新的綁定 // 了解更多:http://exploringjs.com/es6/ch_variables.html#sec_let-const-loop-heads setTimeout(function() { console.log(’The index of this number is: ’ + i); }, 3000);} 問題 #3: Debouncing(防抖動)

有些瀏覽器事件能在很短的時間內(nèi)被觸發(fā)多次,例如調(diào)整窗口大小或滾動頁面。如果你給窗口滾動事件添加一個事件監(jiān)聽器,然后用戶不停地快速向下滾動頁面,那你的事件可能在 3 秒之內(nèi)被觸發(fā)數(shù)千次。這會導(dǎo)致非常嚴重的性能問題。

如果在面試中討論到構(gòu)建應(yīng)用程序,以及滾動事件,窗口調(diào)整事件,或者鍵盤事件等,請務(wù)必提及 debouncing 或者 throttling,作為提高頁面速度與性能的方法。來一個 css-tricks 的實例:

2011 年,Twitter 出了一個問題:當(dāng)滾動 Twitter 摘要時,頁面變的很卡甚至無響應(yīng)。John Resig 寫了 一篇關(guān)于這個問題的博客 ,解釋了直接將耗時的函數(shù)綁定在 scroll 事件上是一個多么糟糕的想法。

Debouncing 是解決這個問題的一種方法,它的做法是限制下次函數(shù)調(diào)用之前必須等待的時間間隔。正確實現(xiàn) debouncing 的方法是將若干個函數(shù)調(diào)用 合成 一次,并在給定時間過去之后僅被調(diào)用一次。下面是一個原生 JavaScript 的實現(xiàn),用到了 作用域 , 閉包, this , 和 計時事件 :

// 將會包裝事件的 debounce 函數(shù)function debounce(fn, delay) { // 維護一個 timer let timer = null; // 能訪問 timer 的閉包 return function() { // 通過 ‘this’ 和 ‘a(chǎn)rguments’ 獲取函數(shù)的作用域和變量 let context = this; let args = arguments; // 如果事件被調(diào)用,清除 timer 然后重新設(shè)置 timer clearTimeout(timer); timer = setTimeout(function() { fn.apply(context, args); }, delay); }}

這個函數(shù) — 當(dāng)傳入一個事件(fn)時 — 會在經(jīng)過給定的時間(delay)后執(zhí)行。

函數(shù)這樣用:

// 當(dāng)用戶滾動時被調(diào)用的函數(shù)function foo() { console.log(’You are scrolling!’);}// 在 debounce 中包裝我們的函數(shù),過 2 秒觸發(fā)一次let elem = document.getElementById(’container’);elem.addEventListener(’scroll’, debounce(foo, 2000));

Throttling 是與 debouncing 類似的一種技術(shù),但它不是在調(diào)用函數(shù)之前等待一段時間,throttling 是在較長的時間間隔內(nèi)調(diào)用函數(shù)。所以如果一個事件每 100 毫秒被觸發(fā) 10 次,throttling 會在每隔 2 秒時執(zhí)行一次這個函數(shù),而不是在 100 毫秒內(nèi)執(zhí)行 10 次事件。

來自:http://www.zcfy.cc/article/3-javascript-questions-to-watch-out-for-during-coding-interviews-2537.html

標(biāo)簽: JavaScript
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久精品资源| 久久亚洲道色| 蜜臀国产一区| 激情综合激情| 另类综合日韩欧美亚洲| 亚洲少妇在线| 久久精品在线| 国产va在线视频| 日本午夜精品久久久久| 中文日韩欧美| 在线成人动漫av| 国产精品入口久久| 日本国产亚洲| 亚洲无线观看| 日本一区二区三区视频在线看 | 黄色av一区| 成人精品国产亚洲| 亚洲精选91| 在线视频亚洲欧美中文| 亚洲精品伊人| 久久电影一区| 亚洲综合三区| 777久久精品| 欧美国产专区| 国产伦久视频在线观看| 国产一区二区三区不卡视频网站| 风间由美中文字幕在线看视频国产欧美| 亚洲伦乱视频| 精品免费av在线| 欧美精品激情| 亚洲欧美一级| 日本欧美一区| 亚洲精品国产日韩| 久久精品72免费观看| 国产精品一区免费在线| 蜜臀久久精品| 在线精品亚洲| 欧美国产专区| 噜噜噜久久亚洲精品国产品小说| 日本不卡一二三区黄网| 国产精品丝袜在线播放| 欧洲精品一区二区三区| 一区二区高清| 久久精品亚洲欧美日韩精品中文字幕| 视频在线观看91| 日韩亚洲在线| 一本一道久久a久久精品蜜桃| 欧美+亚洲+精品+三区| 亚洲一区二区三区无吗| 中文字幕高清在线播放| 性一交一乱一区二区洋洋av| 日韩一区二区三区高清在线观看| 国产精品s色| 久久亚洲精品伦理| 999精品一区| 国产精品久久久久9999高清| www.51av欧美视频| 天堂俺去俺来也www久久婷婷| 久久精品国产999大香线蕉 | 米奇777超碰欧美日韩亚洲| 亚洲福利免费| 日韩精品国产欧美| 影院欧美亚洲| 国产二区精品| 国产亚洲一区二区手机在线观看| 国产图片一区| 亚洲三级av| 在线看片一区| 四虎精品一区二区免费| 丝瓜av网站精品一区二区| 精品精品久久| 久久精品国产福利| 久久亚洲人体| 精品久久中文| 中文字幕在线高清| 欧美天堂一区| 日本在线观看不卡视频| 国产精品日本| 亚洲精品乱码久久久久久蜜桃麻豆| 激情91久久| 亚洲女同中文字幕| 亚洲天堂免费| 日韩av二区在线播放| 久久av中文| 国产精品久久久免费| 中文字幕一区二区精品区| 另类亚洲自拍| 久久激情av| 日韩久久精品| 合欧美一区二区三区| 亚洲在线网站| 欧美日韩黄网站| 国产精品一区二区av交换| 欧美精品国产白浆久久久久| 国产精品资源| 欧美中文一区二区| 热久久免费视频| 国产福利一区二区三区在线播放| 亚洲三级网站| 国产日本精品| 999国产精品| 国产精品久久久久久久久免费高清| 国产精品综合色区在线观看| 9999国产精品| 亚洲日韩视频| 蜜桃久久久久| 亚洲风情在线资源| 视频一区中文字幕国产| 国产剧情在线观看一区| 四虎8848精品成人免费网站| 日韩午夜精品| 高清久久一区| 日韩欧美2区| 久久久久久夜| 蜜桃视频一区二区| 国产一区二区三区网| 婷婷五月色综合香五月| 超碰成人av| 精品一区亚洲| 红杏一区二区三区| 中文在线一区| 一区二区三区四区在线看| 国产精品国产三级在线观看| 99在线|亚洲一区二区| 荡女精品导航| 欧美aa在线视频| 日本a级不卡| 日本精品一区二区三区在线观看视频 | 成人羞羞视频播放网站| 久久国产精品免费一区二区三区| 免费视频久久| 亚洲在线电影| 日本中文字幕一区二区视频 | 欧美激情麻豆| 国产精品亚洲综合久久| 亚洲69av| 91成人在线| 日韩成人一级| 91欧美日韩在线| 日韩中文字幕| 国产精品激情| 国产一区丝袜| 久久九九国产| 亚洲欧洲另类| 中文无码日韩欧| 日韩av黄色在线| 91久久精品无嫩草影院| 91福利精品在线观看| 亚洲一区二区av| 日韩av中文在线观看| 青草国产精品| 精品亚洲美女网站| 久久国产三级| 国产乱码精品一区二区三区四区 | 欧美色图一区| 久久久久九九精品影院| 麻豆精品视频在线观看| 国产精品嫩模av在线| 97精品国产| 亚洲专区视频| 久久99国产精品视频| 日韩欧美中文字幕在线视频| 国产精品一站二站| 日韩大片在线观看| 日本在线观看不卡视频| 国产在线看片免费视频在线观看| 日韩电影在线视频| 亚洲精品电影| 国产情侣久久| 青草国产精品| 日韩 欧美一区二区三区| 中文一区一区三区高中清不卡免费| 久久久久国产精品一区三寸| 88久久精品| 日本 国产 欧美色综合| sm久久捆绑调教精品一区| 日韩影片在线观看| 欧洲毛片在线视频免费观看| 国产美女亚洲精品7777| 999久久久91| 久久精品国产成人一区二区三区| 免费人成精品欧美精品| 98精品视频| 久久三级中文| 日本成人中文字幕| 精品国产免费人成网站| 亚洲精品美女| 亚洲精品一二三区区别| 国产v日韩v欧美v| 韩日一区二区| 国产精品分类| 国产欧美高清视频在线| 99riav国产精品| 日本久久成人网| 久久网站免费观看| 五月天久久久| 成人三级高清视频在线看| 国产日韩1区| 国产伦精品一区二区三区千人斩 | 亚洲免费观看高清完整版在线观|