1. 程式人生 > >javascript setTimeout面試題分析

javascript setTimeout面試題分析

1、題目

<span style="background-color: rgb(255, 255, 255);"><span style="font-size:14px;">/*
*面試官給的原題目如下:
*執行mytest()後,控制檯輸出內容是_____
*function mytest() {
*    for(var i = 0; i < 5; i ++)
*        setTimeout(console.log(i),0);
*}
*但這應該不是面試官的問題,當時我也沒有發現問題,回來測試後才發現,這個函式不是
*面試官要表達的意思。
*/
//正確的程式碼如下:
function mytest() {
    for(var i = 0; i < 5; i ++)
        setTimeout(function(){
            console.log(i);
        },0);
}</span></span>

2、分析

我的回答是:控制檯輸出為5 5 5 5 5,雖然答案對了,但是解釋就太牽強了,我說是因為for語句之執行速度比setTimeout函式快,面試笑了笑,嗚嗚~~(這有毛關係)。
後來網上找了一些資料,參考了一些書籍,這裡我給出一個靠譜的解釋:

首先,我們必須承認,js是單執行緒的,即使是對於ajax非同步方式或者像setTimeout這樣的函式。

其次,我們要理解js函式的執行過程,對於setTimeout這樣的函式來說並不是每次都能按照預定延遲的時間執行指定函式的。下面舉一個列子:

比如有一個函式fun0在執行開始時建立了一個定時器T1,T1定時器將在200ms後被觸發指定函式。這時我們需要考慮一個問題,假設fun0的執行時間為250ms(大於200ms),那將會怎樣?前面已經說過,js是單執行緒的,所以不存在fun0和定時器同時執行的情況。這時候定時器制定的函式會在fun0執行完後才執行,定時器的等待時間為250ms,並不是我們指定的200ms。

對於這樣的執行方式,我們可以想象在函式執行過程中有兩個佇列。佇列Q1是指執行佇列,每次只能執行一個函式;佇列Q2就是等待佇列,存放著將要執行的函式。每當有一個函式要執行時,就會先把這個函式放進等待佇列,如果Q1為空,那麼久立即執行這個函式。當然在大多數情況下,函式都是立即執行的。

因此,我們可以知道,setTimeout定時器指定的函式必須要在當前執行佇列為空時才會執行。

現在我們再來分析一下上面那道題,很顯然,每次的for迴圈都觸發了一個定時函式,這些定時函式有點特殊,是立即執行的(如果執行佇列為空的話)。但是在每次觸發時,for迴圈都還未結束,也就是執行佇列不為空,此時新建的定是函式只能放在等待佇列裡無法立即執行。當最後一次for迴圈執行結束後,執行佇列變為空,這時等待佇列的函式就立即進入到了執行佇列,於是就開始執行只控制檯輸出。因為setTimeout指定的匿名函式中i的值是一種引用值(自行谷歌腦補),

所以輸出結果為5 5 5 5 5。

源引:http://www.suchso.com/projecteactual/js-setTimeout-mianshiti.html

相關推薦

javascript setTimeout試題分析

1、題目 <span style="background-color: rgb(255, 255, 255);"><span style="font-size:14px;">/* *面試官給的原題目如下: *執行mytest()後,控制檯輸出內容是_

JavaScript同步、非同步、回撥執行順序之經典閉包setTimeout試題分析

初心-楊瑞超個人部落格誠邀您加入qq群(IT-程式猿-技術交流群):757345416 大家注意了,教大家一道口訣: 同步優先、非同步靠邊、回撥墊底(讀起來不順) 用公式表達就是: 同步 => 非同步 => 回撥 有一道經典的面試題: for

JavaScript同步、非同步、回撥執行順序之經典閉包(setTimeout試題分析

同步、非同步回撥?傻傻分不清楚。 大家注意了,教大家一道口訣: 同步優先、非同步靠邊、回撥墊底! 公式表達:同步=>非同步=>回撥 這口訣的用處是什麼呢?至少應付面試,完全夠用! 例1:(經典面試題) for(var i=0; i<5; i++){ set

js同步異步執行順序setTimeOut試題分析

asc func 運行機制 .html tar target 關系 裏的 等待 <script> for(var i=0;i<2;i++){ setTimeout(function(){ conso

JavaScript常見筆試題分析

可能 span 筆試題 typeof font 筆試 asc scrip function 1.Javascript的typeof可能返回的結果有哪些?   答:共6種,具體為number ,boolean,string,undefined,function,object(

前端javaScript經典試題

new 可能 spa 設置 沒有 sco test 問題 輸出結果 1.alert(1&&2),alert(1||0) alert(1&&2)的結果是2 只要“&&”前面是false,無論“&&”後

請拿出30分鐘鉆研此文,系統掌握java試題分析技巧

java 面試 架構師 談一談對MySQL InnoDB的認識 介紹: InnoDB引擎是MySQL數據庫的一個重要的存儲引擎,和其他存儲引擎相比,InnoDB引擎的優點是支持兼容ACID的事務(類似於PostgreSQL),以及參數完整性(有外鍵)等。現在Innobase實行雙認證授權.MySQ

JavaScript經典試題詳解

局部對象 hello 結果 檢查 fun type 功能 初始化 als 以下是我遇到的一些經典的JS面試題,結合我自己的理解寫的詳解,主要參考高程一書,歡迎大家批評指正 1. var a; console.log(a);

二叉樹的經典試題分析(三十六)

        我們之前學習了二叉樹相關的概念,那麼我們今天來分析下二叉樹中的一些經典面試題。         1、單度結點的刪除  

阿里java試題分析

這道題來源於阿里巴巴的面試 public class Text {                    &

javascript經典試題

1、作用域 (function() { var a = b = 5; })(); console.log(b); //5 複製程式碼 這個問題的陷阱就是,在立即執行函式表示式(IIFE)中,有兩個賦值,但是其中變數a使用關鍵詞var來宣告。這就意味著a是這個函式的區域性變數。與此相反,b被分配給

有關Javascript試題

獲取頁面元素位置與寬高? element.clientWidth = content + padding element.clientHeight = content + padding element.getBoundingClientRect() 返回值情況 left:包

JavaScript 常見面試題分析(一)

小編推薦:Fundebug專注於JavaScript、微信小程式、微信小遊戲,Node.js和Java實時BUG監控。真的是一個很好用的bug監控費服務,眾多大佬公司都在使用。 01 JavaSctipt 中使用 typeof 能得到的型別有哪些? 這道題考察的是 JS 的變數

5個JavaScript經典試題

1:Scope作用範圍 複製程式碼程式碼如下:  (function() {     var a = b = 5;  })();  console.log(b); 什麼會被列印在控制檯上? 回答 上面的程式碼會列印 5。 這個問題的訣竅是,這裡有兩個變數宣告,但 a 使用關鍵字var宣告

【Java試題】之類載入:從試題分析Java類載入機制

 “載入”(Loading)階段是“類載入”(Class Loading)過程的第一個階段,在此階段,虛擬機器需要完成以下三件事情:        1、 通過一個類的全限定名來獲取定義此類的二進位制位元組流。        2、 將這個位元組流所代表的靜態儲存結構轉化為方法區的執行時資料結

你必須知道的25道JavaScript核心試題

在多年的程式設計生涯裡,我常常面臨著各種新的語言,新的工具。但是語言、工具最終也僅僅為工具,最終目的是分析問題,解決問題。雖然常年在一個領域,一種語言裡摸爬滾打,可能對語言本身的理解更為深刻,即使是有意識的去系統、全面的學習瞭解這種語言的,也可能只是當時對語言本身有些瞭

javascript經典試題 全域性變數和區域性變數 變數作用域

1.題目 var a = 10; function test(){ a = 100; console.log(a); console.log(this.a); var a; console.log(a); } test(

“玩轉”Java系列—Struts2 試題分析

1. 簡述 Struts2 的工作流程: ①. 請求傳送給 StrutsPrepareAndExecuteFilter ②. StrutsPrepareAndExecuteFilter 判定該請求是否是一個 Struts2 請求 ③. 若該請求是一個 Struts2

11月20日試題分析與EL表示式培訓日記

今天新班開學典禮,我必須出席,所以,上午安排這個班的學員們練習昨天講解的SimpleFormController。一兩個學員瞞著我,外出找公司面試了幾把,最後問了我幾道令他們心虛的幾道面試題,下午我先為大家分析了這幾道面試題:1.在使用new關鍵字建立某個類的例項物件時,構造

一道阿里多執行緒試題分析

首先,來看看這個面試題目吧。 題目來源:   http://www.linuxidc.com/Linux/2014-03/98715.htm public class MyStack { private List<String> lis