1梨水,函數(shù)聲明與函數(shù)表達式的區(qū)別是什么乏矾?
考察點:函數(shù)聲明提升
答:函數(shù)聲明在函數(shù)調(diào)用時可以提前調(diào)用,存在“函數(shù)聲明提升”润匙,而函數(shù)表達式則不行诗眨。
2,回調(diào)函數(shù)和promise在JS的事件循環(huán)機制上有什么本質(zhì)上的區(qū)別孕讳?
答:回調(diào)函數(shù)的callback是等待異步回調(diào)有響應后匠楚,將回調(diào)函數(shù)插入事件循環(huán)隊列的末尾,等待主進程調(diào)用厂财。
promise的then
3油啤,什么是單線程,和異步有什么關系蟀苛?
答:單線程:只有一個線程益咬,同一時間只能做一件事情。
JS單線程是為了避免DOM渲染沖突。
瀏覽器需要渲染DOM幽告,JS可以修改DOM結(jié)構梅鹦,JS執(zhí)行時候,瀏覽器DOM渲染會停止冗锁,兩段JS不能同時執(zhí)行(都修改DOM就沖突了)齐唆,webworker支持多線程,但是不能訪問DOM冻河。異步就是來解決這個問題的箍邮。
4,什么是event-loop(事件循環(huán))?
關鍵詞:主進程+異步隊列
答:事件輪詢叨叙,JS實現(xiàn)異步的具體解決方案锭弊。同步代碼直接執(zhí)行,異步函數(shù)先放在異步隊列中擂错,待同步函數(shù)執(zhí)行完成后味滞,輪詢執(zhí)行異步隊列的函數(shù)。
5钮呀,是否用過jQuery的Deferred
答:deferred:延遲的意思剑鞍。Deferred對象是jQuery1.5之后引入的針對異步的解決方案之一。jQuery的Deferred對象符合開放-封閉原則爽醋,對擴展開放蚁署,對修改封閉。promise和Deferred的區(qū)別蚂四,用Deferred生成的promise對象(deferred.promise())不能使用resolve光戈,reject去修改狀態(tài),只能監(jiān)聽使用then,done证杭,fail等方法田度。
6妒御,Promise的基本使用和原理
答:Promise的三種狀態(tài):pending解愤,fulfilled,rejected乎莉,狀態(tài)不可逆送讲。Promise有resolve,reject惋啃,then哼鬓,catch,race边灭,all等方法异希。then函數(shù)中沒有明文返回promise實例,則返回之前的promise實例绒瘦。
異常的捕獲(error和reject的捕獲)称簿,可以使用catch去統(tǒng)一捕獲扣癣,promise可以使用鏈式操作執(zhí)行,不用寫多個callback函數(shù)憨降。
7父虑,介紹一下async/await(和Promise的區(qū)別,聯(lián)系)
答:async/await是最直接的同步寫法寫異步函數(shù)授药,使用await士嚎,函數(shù)必須有async標識,await后面跟的一定是一個Promise實例悔叽,使用了promise莱衩,但是沒有和promise沖突,沒有取代promise骄蝇,只是同步的一種寫法膳殷,沒有了回調(diào)函數(shù)的寫法。
8九火,總結(jié)一下當前JS解決異步的方案
答:當前JS異步解決方案有:
1赚窃,異步回調(diào) 2,Promise對象 3岔激,generator生成器 4勒极,async/await,拋棄回調(diào)函數(shù)的寫法 5虑鼎,事件監(jiān)聽 6辱匿,發(fā)布訂閱等