1. 程式人生 > >對迴圈中setTimeout執行過程的思考

對迴圈中setTimeout執行過程的思考

題目

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

答案

每隔一秒輸出5

分析

由於setTimeout會延遲執行,所以處理結果是執行迴圈之後再將裡面的函式壓入事件佇列。執行迴圈的時候壓入佇列的函式是:0s console.log(i);1s console.log(I);….所以每隔一秒輸出i。而由於i是var型別的,由於變數提升,最後的i都變成5了。於是最後都列印5

如果將上面的程式碼變成這樣:

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

顯然是每隔一秒輸出0,1,2,3,4了,因為let存在塊級作用域。

那麼將程式碼變成這樣呢?

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

由於setTimeout裡面是立即執行函式,於是便不會根據時間延遲將函式壓入佇列,而是直接進入事件迴圈執行。所以會直接進行輸出0,1,2,3,4。

相關推薦

迴圈setTimeout執行過程思考

題目 for (var i = 0; i < 5; i++) { setTimeout(function() { console.log(i); }, 1000 * i); } 答案 每隔一秒輸出5 分析 由於setT

php嵌入到html執行過程

兩種 js代碼 瀏覽器 php代碼 技術 處理 htm img 解析 1. php嵌入到html中的執行過程?   當php功能模塊在處理一個php文件時,它只關心php代碼(使用php標簽包含的代碼),對於非php代碼,它會原樣輸出;   例如右圖代碼:     php功

032_面向象_05_程序執行過程的內存分析_02

void nbsp 包括 bsp 程序 執行過程 計算機類 行為 cpu 一、實例代碼   package edu.aeon.test; /** * [說明]計算機類 * @author aeon */ public class Computer { /**

計算機指令在CPU執行過程(圖文版)

為了瞭解指令的大概流程,下面以加法指令做以說明(引用《計算機原理》)。 指令形式: ADD EA 該指令一個隱含的運算元存在累加器(AC)中,EA為另一個運算元在主存當中的有效地址。 該指令是把AC和EA的資料相加,最後把計算的和送回AC中,即AC+EA -> AC。

python展示執行過程圖片的程式碼

轉自:http://www.cnblogs.com/yinxiangnan-charles/p/5928689.htm 一:利用lmatplotlib第三方庫函式來畫圖片 import matplotlib as plt # plt中的方法來讀取圖片 image=plt

for迴圈執行緒的無序性

在學習多執行緒的互斥與同步中遇到一個問題,如下:public class Test { static int i; public static void main(String[] args) { for(i=0; i<10; i++){ new Thread

Spring系列之AOP分析之通知方法的執行過程(九)

轉載請註明出處:https://blog.csdn.net/zknxx/article/details/80261327 我們在上一篇文章中說到了前置通知的方法呼叫AspectJMethodBeforeAdvice#before,在這個before方法中又呼叫

Hadoop1Task執行過程

當我們編寫一個Mapreduce的作業時候,只需要實現map()和reduce()兩個函式就可以。 其中map階段大概可以劃分 read 、map、collect、spill和combine五個階段 。reduce階段可以劃分shuffle、merge、so

for 迴圈setTimeout(function () { console.log(i)},100)的非同步問題

for (var i =0; i <3; i++) { setTimeout(function () { console.log(i); },100) }上述程式碼執行完後,列印3次

資料庫Explain 執行過程的檢視

因為最近看Hive ,Hive 其實就是MapReduce的封裝,基於一個統一的查詢分析層,通過SQL語句的方式對HDFS上的資料查詢進行查詢,統計和分析,這個過程是一個MR過程,我們如何能夠通過檢視執行sql的過程來檢視MR這個過程,從而做到後續的一些優化之類的。 使用E

mysqlSQL執行過程詳解

 mysql執行一個查詢的過程,到底做了些什麼:   客戶端傳送一條查詢給伺服器; 伺服器先

大話Spark(3)-一圖深入理解WordCount程式在Spark執行過程

本文以WordCount為例, 畫圖說明spark程式的執行過程 WordCount就是統計一段資料中每個單詞出現的次數, 例如hello spark hello you 這段文字中hello出現2次, spark出現1次, you出現1次. 先上完整程式碼: object WordCount {

C#調用SQL存儲過程並用DataGridView顯示執行結果

exec char 登錄名 dataset type data comm and def //連接數據庫 SqlConnection con = new SqlConnection("server=服務器名稱;database=數據庫名稱;user id=登錄名;pwd=登

SQLServer執行計劃緩存由於長時間緩存性能造成的幹擾

找到 產品 ans ads 實戰 alt 開發 實時計算 query 本文出處:http://www.cnblogs.com/wy123/p/7190785.html (保留出處並非什麽原創作品權利,本人拙作還遠遠達不到,僅僅是為了鏈接到原文,因為後續對可能存在的

java一個象的初始化過程

關系 col 中一 show 父類 style 覆蓋 結果 pan // 對象初始化的過程 class Fu { int num=55;// 1, num=0;對象中的成員變量默認初始化。5, 顯示初始化 num=55 { S

pip install 執行過程遇到的各種問題

efault 就是 阿裏 pip安裝 clas aliyun blog key 新版 一、pip install 安裝指定版本的包 要用 pip 安裝指定版本的 Python 包,只需通過 == 操作符 指定。 pip install robotframework ==

java象的創建過程

color pos 文件 創建 log class對象 存儲 舉例 font 舉例:類A的的對象a的創建過程 1,因為構造器實質上是靜態方法,當首次創建A類的對象時(即執行了A類的靜態方法),或者A類的靜態方法/靜態域首次被訪問時,java解釋器必須查找類路徑,以定位A.

生成器接受和返還功能在執行過程的詳解

top exce ret one 代碼 stop ngx put rsa 1 import random 2 3 SENTENCES=[ 4 ‘How are you ?‘, 5 ‘Fine,thank you!‘, 6 ‘Nothi

自動化接口用例從 1 到 1000 過程的實踐和思考

而在 信息 dfa 不同 清除 opera 等待 就是 基類 引言 當一個新人剛加入公司的時候,我們通常告訴新人怎麽去寫一個自動化用例:從工程配置到如何添加接口、如何使用斷言,最後到如何將一個用例運行起來。 而在實際工作和業務場景中,我們常常面臨著需要編寫和組織一堆用例的情

Hive執行過程出現Caused by : java.lang.ClassNotFoundException: org.cloudera.htrace.Trace的錯誤解決辦法(圖文詳解)

pre wid logs In 實用 過程 ase edit 微信     不多說,直接上幹貨! 問題詳情     如下   這個錯誤的意思是缺少 htrace-core-2.04.jar。  解決辦法: