摘要:?jiǎn)栴}之前有提到一個(gè)異步問(wèn)題,如下代碼輸出什么這是我近期遇到的一個(gè)面題。探索為什么呢首先,是異步執(zhí)行的。如果不考慮兼容性,我們可以使用的,把每個(gè)變成一個(gè)局部變量。假設(shè)的時(shí)間是一個(gè)隨機(jī)數(shù)。
問(wèn)題
之前有提到一個(gè)異步問(wèn)題,如下代碼輸出什么:
for(var i = 0;i<10;i++){ setTimeout(function(){ console.log(i); },1000); }
這是我近期遇到的一個(gè)面題。當(dāng)時(shí)我并不知道。不過(guò)后來(lái)面試官告訴我,setTimeout是異步執(zhí)行的。并且告訴了我答案。后來(lái)在群里邊討論,明白了。會(huì)輸出10個(gè)10。
探索為什么呢?首先,setTimeout是異步執(zhí)行的。所以在setTimeout執(zhí)行之前,全局變量i早就已經(jīng)變成了10。
那么如何解決能讓他輸出0-9呢?其實(shí)要解決的就是:在使用i的時(shí)候保證i的值還是我們當(dāng)時(shí)希望的那個(gè)值。
如果不考慮兼容性,我們可以使用es6的let,把每個(gè)i變成一個(gè)局部變量。代碼如下:
for(let i = 0;i<10;i++){ setTimeout(function(){ console.log(i); },1000); }
如果要考慮兼容性,那么我們用一個(gè)匿名函數(shù),把i當(dāng)做參數(shù)傳進(jìn)去,這樣我們?cè)儆玫膇就是局部變量了。不會(huì)受到外邊的影響了。代碼如下:
for(var i = 0;i<10;i++){ (function(i){ setTimeout(function(){ console.log(i); },1000); })(i) }
如果使用promise,那么我們可以使用如下寫(xiě)法:
for(var i = 0;i<10;i++){ let a = i; let p = new Promise((resolve,reject)=>{ setTimeout(()=>{resolve(a)},1000); }); p.then(i=>console.log(i)) }思考
可能這種promise方法更麻煩了。但是適用于更復(fù)雜的需求了。假設(shè)setTimeout的時(shí)間是一個(gè)隨機(jī)數(shù)。而我們要在所有數(shù)字都打印完畢再去做一些操作,那么該怎么做呢?
具體可以參見(jiàn):https://segmentfault.com/a/11...
執(zhí)行效率上的考慮:
console.time("a"); for(let i = 0;i<10;i++){ setTimeout(function(){ console.log(i); },1000); } console.timeEnd("a"); console.time("b"); for(var i = 0;i<10;i++){ (function(i){ setTimeout(function(){ console.log(i); },1000); })(i) } console.timeEnd("b"); console.time("c"); for(var i = 0;i<10;i++){ let a = i; let p = new Promise((resolve,reject)=>{ setTimeout(()=>{resolve(a)},1000); }); p.then(i=>console.log(i)) } console.timeEnd("c");
效率上,我在目前新版chrome的執(zhí)行結(jié)果如下:
a: 0.35009765625ms b: 0.348876953125ms c: 0.880126953125ms
注意:可能不同系統(tǒng)不同環(huán)境的執(zhí)行結(jié)果不一樣。所以,有時(shí)候極客玩玩就是了,認(rèn)真你就輸啦-.-
總結(jié)以前我偏執(zhí)的認(rèn)為,能做出東西就行了?;A(chǔ)不重要。所以我總是一只停留在做東西的階段。但是后來(lái)反過(guò)來(lái)想:假設(shè)你想買車,那么你會(huì)選一個(gè)對(duì)汽車參數(shù)很熟的銷售員還是選擇一個(gè)你問(wèn)什么問(wèn)題他都說(shuō)查查再回答你的銷售員呢?答案是肯定的。所以說(shuō),可能公司招人也一樣吧。
但是,這些問(wèn)題真的有用嗎?沒(méi)錯(cuò),我都有很多問(wèn)題沒(méi)回答好,如果是為了準(zhǔn)備一次很nice的面試,我大可以特意的多跑幾家,然后把遇到的有問(wèn)題的面試題都總結(jié)下來(lái)。不會(huì)的再去查詢,我想翻來(lái)覆去也沒(méi)多少基礎(chǔ)可問(wèn)吧?就像找個(gè)美工就問(wèn):你會(huì)切圖嘛?這些稍微花點(diǎn)時(shí)間都能學(xué)會(huì)的問(wèn)題。個(gè)人覺(jué)得沒(méi)特別大的意義。
(本文摘取自我的博客:http://79px.com/blog/57cd347b...)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/90980.html
摘要:最近做微信小程序的開(kāi)發(fā)時(shí),想做一個(gè)靠感知手機(jī)方向,使頁(yè)面上節(jié)點(diǎn)跟隨移動(dòng)的動(dòng)畫(huà)即重力感應(yīng)視差效果功能。最終實(shí)現(xiàn)的效果會(huì)有卡頓現(xiàn)象。如果是后臺(tái)標(biāo)簽頁(yè)面,重繪頻率則會(huì)大大降低。較于,能得到更完整的加速的支持。 最近做微信小程序的開(kāi)發(fā)時(shí),想做一個(gè)靠感知手機(jī)方向,使頁(yè)面上節(jié)點(diǎn)跟隨移動(dòng)的動(dòng)畫(huà)(即重力感應(yīng)視差效果)功能。結(jié)果發(fā)現(xiàn)微信小程序有一些坑: 微信小程序不支持html5的DeviceOrie...
摘要:最近做微信小程序的開(kāi)發(fā)時(shí),想做一個(gè)靠感知手機(jī)方向,使頁(yè)面上節(jié)點(diǎn)跟隨移動(dòng)的動(dòng)畫(huà)即重力感應(yīng)視差效果功能。最終實(shí)現(xiàn)的效果會(huì)有卡頓現(xiàn)象。如果是后臺(tái)標(biāo)簽頁(yè)面,重繪頻率則會(huì)大大降低。較于,能得到更完整的加速的支持。 最近做微信小程序的開(kāi)發(fā)時(shí),想做一個(gè)靠感知手機(jī)方向,使頁(yè)面上節(jié)點(diǎn)跟隨移動(dòng)的動(dòng)畫(huà)(即重力感應(yīng)視差效果)功能。結(jié)果發(fā)現(xiàn)微信小程序有一些坑: 微信小程序不支持html5的DeviceOrie...
摘要:最近做微信小程序的開(kāi)發(fā)時(shí),想做一個(gè)靠感知手機(jī)方向,使頁(yè)面上節(jié)點(diǎn)跟隨移動(dòng)的動(dòng)畫(huà)即重力感應(yīng)視差效果功能。最終實(shí)現(xiàn)的效果會(huì)有卡頓現(xiàn)象。如果是后臺(tái)標(biāo)簽頁(yè)面,重繪頻率則會(huì)大大降低。較于,能得到更完整的加速的支持。 最近做微信小程序的開(kāi)發(fā)時(shí),想做一個(gè)靠感知手機(jī)方向,使頁(yè)面上節(jié)點(diǎn)跟隨移動(dòng)的動(dòng)畫(huà)(即重力感應(yīng)視差效果)功能。結(jié)果發(fā)現(xiàn)微信小程序有一些坑: 微信小程序不支持html5的DeviceOrie...
摘要:我們?cè)诿嬖囍薪?jīng)常會(huì)遇到或提出這樣一個(gè)問(wèn)題求下列代碼輸出結(jié)果通常來(lái)說(shuō)這個(gè)題目的答案是本地主要考察瀏覽器的單線程和機(jī)制相關(guān)文章已經(jīng)有很多就不再贅述但是如果在開(kāi)發(fā)者工具中運(yùn)行結(jié)果會(huì)是什么本次討論以的開(kāi)發(fā)者工具為例讓我們隨便打開(kāi)一個(gè)網(wǎng)頁(yè)敲入代碼觀察 我們?cè)趈avascript面試中經(jīng)常會(huì)遇到或提出這樣一個(gè)問(wèn)題:求下列代碼輸出結(jié)果 setTimeout(function(){console.lo...
摘要:第二套方案,一定程度上改善了第一套方案帶來(lái)的維護(hù)成本增加的缺點(diǎn),主要還是使用工具預(yù)渲染頁(yè)面,獲取到節(jié)點(diǎn)和樣式,保留頁(yè)面結(jié)構(gòu),覆蓋樣式,生成灰色塊蓋在原有文本圖片或者是等節(jié)點(diǎn)上面,最后將生成的和打包出來(lái),就是一個(gè)帶有骨架屏的頁(yè)面。 首屏 一般情況下,在首屏數(shù)據(jù)未拿到之前,為了提升用戶的體驗(yàn),會(huì)在頁(yè)面上展示一個(gè)loading的圖層,類似下面這個(gè)showImg(https://segment...
閱讀 2516·2021-11-15 11:36
閱讀 1260·2019-08-30 15:56
閱讀 2313·2019-08-30 15:53
閱讀 1104·2019-08-30 15:44
閱讀 715·2019-08-30 14:13
閱讀 1052·2019-08-30 10:58
閱讀 542·2019-08-29 15:35
閱讀 1370·2019-08-29 13:58