復(fù)雜代碼拆開之面試題(搞事)

總結(jié):
1,先關(guān)注類型再關(guān)注值
2,一行不要做兩件事(拆)

一,

 for (var i = 0; i < 5; i++) {
  //下面是在執(zhí)行console的一個函數(shù)log(),輸出i,return出undefined的值,總的來說下面是在執(zhí)行函數(shù)(同立即執(zhí)行函數(shù))
  console.log(i);
 }

輸出:0,1,2,3,4

注意:
1,輸出結(jié)果和返回值是兩個 不同的值
2,說明console是一個對象


圖片.png

log()是console對象的一個函數(shù)


圖片.png

二,

for (var i = 0; i < 5; i++) {
   setTimeout(function() {
   console.log(i);
   }, 1000 * i);
}

輸出:5個5

注意:
1,第一次循環(huán),設(shè)置了一個鬧鐘 0ms。第二次循環(huán),設(shè)置了一個鬧鐘1000ms。。。共設(shè)置了5個鬧鐘
2,注意setTimeout的作用是,鬧鐘時間到了,執(zhí)行函數(shù),下次時間到了,執(zhí)行函數(shù)。。。共執(zhí)行了5此函數(shù)
3,為什么5次輸出都是5呢?
因為console.log輸出的是一個全局變量i
實際情況是:
0毫秒 console.log(i) //i=0
1000毫秒 console.log(i) //i=1~4不定值
2000毫秒 console.log(i) //i=1~4不定值
3000毫秒 console.log(i) //i=1~4不定值
4000毫秒 console.log(i) //i=1~4不定值
最后:i的值是5,并且它可以被下次什么東西給執(zhí)行,這個時候循環(huán)結(jié)束,下面的執(zhí)行就是settimeout的作用了,它的作用是把設(shè)置的5個鬧鐘一次性敲響,敲響了5個,輸出i,但這個時候的i值已經(jīng)是5了
要記住,console.log輸出的是一個全局變量,所以會被后面的賦值覆蓋,但是這個是setTimeout,時間到,執(zhí)行函數(shù),所以積累了5個函數(shù)執(zhí)行動作要執(zhí)行,1000~4000應(yīng)該輸出的值不一定是確定的1,2,3,4,,但是,輸出的這個i,確定會被最后的5覆蓋。

三,

 for (var i = 0; i < 5; i++) {
     (function(i) {
       setTimeout(function() {
       console.log(i);
       }, i * 1000);
    })(i);//傳入的這個i是每次循環(huán)的具體一個值,聲明是在for里面
 }

根據(jù)上面的解釋,循環(huán)體里面是一個函數(shù)的執(zhí)行并且有形參
循環(huán)第一次,i=0:
傳入?yún)?shù)值0,第一步是var i「function(i)中的i」,第二步i=0,第三步console.log(i)等待輸出所以,這里把傳入的i保存下來了
循環(huán)第二次,i=1:
傳入?yún)?shù)值1,第一步是var i,第二步i=1,第三步console.log(i)等待輸出
。。。
所有輸出:0,1,2,3,4

重點:

1,所以,這里的i每次循環(huán)都在函數(shù)內(nèi)部聲明了一次,這里把傳入的i保存下來了
2,盡管最后一次的i=5,但是這個i值并不能覆蓋函數(shù)內(nèi)部的變量

四,

for (var i = 0; i < 5; i++) {
  (function() {
  setTimeout(function() {
    console.log(i);
    }, i * 1000);
  })(i);
}

拆開:

圖片.png

這里,確確實實每次輸入的值是當(dāng)前循環(huán)的i但是,console.log(i),這個i是一個全局變量,所有最后的輸出會被最后的i值5全部覆蓋

五,

 for (var i = 0; i < 5; i++) {
   setTimeout((function(i) {
      console.log(i);
   })(i), i * 1000);
 }
圖片.png

輸出:0,1,2,3,4

圖片.png

六,

setTimeout(function() {
    console.log(1)
}, 0);
new Promise(function executor(resolve) {
       console.log(2);
       for( var i=0 ; i<10000 ; i++ ) {
              i == 9999 && resolve();
        }
       console.log(3);
  }).then(function() {
  console.log(4);
 });
console.log(5);
圖片.png

下面這句沒有任何意思,只是判斷而已
resolve()沒有任何返回值
i == 9999 && resolve();

步驟:
1,setTimeout入棧
2,聲明函數(shù) executor,打印2,new promise
3,for循環(huán)
4,等待for循環(huán)執(zhí)行完畢,打印 3,打印5
5,for執(zhí)行完后,調(diào)用Promise.resolve()

參考
面試題

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,993評論 19 139
  • 工廠模式類似于現(xiàn)實生活中的工廠可以產(chǎn)生大量相似的商品,去做同樣的事情,實現(xiàn)同樣的效果;這時候需要使用工廠模式。簡單...
    舟漁行舟閱讀 7,854評論 2 17
  • 函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別 (*)解析器會率先讀取函數(shù)聲明,并使其在執(zhí)行任何代碼之前可以訪問;函數(shù)表達(dá)式則必須...
    coolheadedY閱讀 402評論 0 1
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,779評論 18 399
  • 在做這個功能之前我是一點都不了解這是啥,趕在雙節(jié)之后的第一天,有點趕鴨子上架的趕腳。在做這個功能之前先了解一下這是...
    林天佐閱讀 6,141評論 1 3