前幾天面試遇到了一些問題,剛好今天偶然間看到了這個問題,決定記錄一下es6
定時器中打印結果爲5,考察知識點變量提高,同步和異步
解答:首先定時器爲異步操做,須要等待函數體執行完畢才能夠繼續執行,也就是此時的0,1,2,3,4已經打印出來了,i=4時條件成立,i++,此時i=5,下一輪判斷失敗,結束循環
由於var 存在變量提高,至關於這樣面試
因此最後的爲5,定時器輸出爲5babel
而後我又想了想,若是定時器想要打印出0,1,2,3,4有幾種實現方式
第一種:
上結果異步
採用當即執行表達式來模擬塊級做用域,這樣的做用是每次將i的值封存在這個匿名函數中,根據做用域返回的定時器會讀取匿名函數傳遞的參數,而不會去讀取相隔那麼遠的放在全局的值,這樣就OK了函數
第二種 es6 letes5
原理呢和上面差很少,只是採用es6語法,就是let聲明的變量只在它所在的代碼塊有效。而var命令聲明的,在全局範圍內都有效,全局只有一個變量i,for循環執行語句也至關於一個塊級做用域。so,就是0,1,2,3,4spa
看一下let用babel降級到es5的樣子,基本差很少ip
-----------------------------end------------------------------------------------作用域