一道阿里巴巴Web前端面試題拓展
第二第三個(gè)問(wèn)題由第一個(gè)拓展而來(lái),先看問(wèn)題吧:
第一問(wèn):
var a = 6;
setTimeout(function () {
alert(a); //輸出66
a = 666;},
1000);
a = 66;
第二問(wèn):
var a = 6;
setTimeout(function () {
var a = 666;
alert(a); // 輸出666,
}, 1000);
a = 66;
第三問(wèn):
var a = 6;
setTimeout(function () {
alert(a); // 輸出undefined,
var a=666;
}, 1000);
a = 66;
這三個(gè)問(wèn)題涉及到了setTimeout的工作原理,執(zhí)行環(huán)境與作用域還有函數(shù)的創(chuàng)建與調(diào)用。
首先先說(shuō)一下setTimeout(function(),ms)函數(shù),現(xiàn)在在我們的js文件中有這么一段代碼:setTimeout( a() , 5000 );。
在執(zhí)行流執(zhí)行到setTimeout代碼時(shí),并不會(huì)原地踏步地等待執(zhí)行完畢后再向下執(zhí)行,而是會(huì)告訴瀏覽器,我這段代碼要等待5秒之后再執(zhí)行,然后立即向下執(zhí)行接下來(lái)的代碼。
現(xiàn)在可以先解決第一問(wèn)了。
首先定義了一個(gè)局部變量a,并且a=6 。然后執(zhí)行流遇到了setTimeout(),告訴瀏覽器,我1秒之后再執(zhí)行這段代碼,此時(shí)a仍然為6。然后跳過(guò)setTimeout()中的代碼繼續(xù)向下執(zhí)行,就碰到了a=66,將a賦值為66 。一秒過(guò)去了之后,瀏覽器開(kāi)始調(diào)用setTimeout()函數(shù)中的匿名函數(shù),遇到了alert(a),在此之前匿名函數(shù)中并沒(méi)有創(chuàng)造局部變量a,所以隨著作用域鏈由內(nèi)向外搜尋有沒(méi)有變量a。當(dāng)搜尋到外部函數(shù)的作用域時(shí),發(fā)現(xiàn)a已經(jīng)被賦值成了66,則返回結(jié)果,最終彈出窗口顯示66。
第二問(wèn)中,由于在setTimeout()的匿名函數(shù)中擁有了一個(gè)局部變量a,所以最后alert(a)輸出的是666,這一個(gè)沒(méi)什么可說(shuō)的。
至于第三問(wèn)的解答,涉及到了一個(gè)函數(shù)的創(chuàng)建與執(zhí)行的區(qū)別,讓我想起了C和C++中的.函數(shù)創(chuàng)建執(zhí)行部分(更多的是本人的猜想,未經(jīng)求證),在進(jìn)入setTimeout()函數(shù)之后,我們得先創(chuàng)建一個(gè)函數(shù),然后才能執(zhí)行它,在創(chuàng)建函數(shù)的時(shí)候,會(huì)搜尋函數(shù)內(nèi)部是否有變量創(chuàng)建出來(lái)了。所以,當(dāng)執(zhí)行流遇到alert(a)的時(shí)候,開(kāi)始搜尋當(dāng)前環(huán)境下有沒(méi)有a變量,最終發(fā)現(xiàn)了一個(gè)a變量,但是在未執(zhí)行var a=666之前,a并沒(méi)有被賦值,所以alert(a)的最終結(jié)果為undefined。
這三個(gè)問(wèn)題涉及到了setTimeout的工作原理,執(zhí)行環(huán)境與作用域還有函數(shù)的創(chuàng)建與調(diào)用。
http://www.ardmore-hotel.com/【一道阿里巴巴Web前端面試題拓展】相關(guān)文章:
web前端開(kāi)發(fā)面試題05-31
web前端面試題及答案02-19
Web前端面試題目及答案06-09
web前端工作技能簡(jiǎn)歷范文01-11
web前端網(wǎng)頁(yè)設(shè)計(jì)師簡(jiǎn)歷模板10-27
web前端工程師簡(jiǎn)歷參考模板02-18
Web/Ajax的面試題06-14
前端面試題及答案05-09
java前端開(kāi)發(fā)面試題05-09