昨天去一家公司面試前端,第二輪技術(shù)面給我出了一個(gè)題varlen=4;while(len--){setTimeout(function(){alert(len);},0);alert(len);}問(wèn)輸出結(jié)果當(dāng)時(shí)有點(diǎn)蒙,自己不熟悉setTimeOut函數(shù)以為time為0就是立即調(diào)用,然后考官說(shuō)setTimeOut是異步的,即使是0也會(huì)在最后執(zhí)行,結(jié)果輸出應(yīng)該為3,2,1,0,-1,-1,-1,-1.后來(lái)又變了題目是:varlen=4;while(len--){(function(i){setTimeout(function(){alert(i);},0);})(len);alert(len);}這次我就很清楚了,產(chǎn)生一個(gè)閉包,每次len的變化i都保存了一個(gè)copy,所以輸出是3,2,1,0,3,2,1,0.但是剛才寫demo的時(shí)候發(fā)現(xiàn)第一段代碼的輸出符合預(yù)期,第二段的輸出開(kāi)始4個(gè)是3,2,1,0但是后面的也就是setTimeout中的輸出有時(shí)候都不一樣,有時(shí)是0,2,1,3有時(shí)是2,1,0,3等等求解釋。
前端面試的一個(gè)小問(wèn)題
BIG陽(yáng)
2019-04-09 20:23:34