對呀初學j**ascript的同學來說,變數提公升永遠都是過不去的坎,相信我們都遇到過這種情況,看下面
var
var arr = ;
for(var i = 0; i <= 10; i++ )
}arr[2]()//輸出為10
變數i是var命令宣告的,在全域性範圍內都有效,所以全域性只有乙個變數i。
每一次迴圈,變數i的值都會發生改變,而迴圈內被賦給陣列a的函式內部的console.log(i),br標籤 裡面的i指向的就是全域性的i。
也就是說,所有陣列a的成員裡面的i,指向的都是同乙個i,導致執行時輸出的是最後一輪的i的值,也就是 10。
let
let arr = ;
for(let i = 0; i <= 10; i++ )
} console.lg(arr[2]) //輸出為2
變數i是let宣告的,當前的i只在本輪迴圈有效,所以每一次迴圈的i其實都是乙個新的變數,所以最後輸出的是6。
你可能會問,如果每一輪迴圈的變數i都是重新宣告的,那它怎麼知道上一輪迴圈的值,從而計算出本輪迴圈的值?
這是因為 j**ascript 引擎內部會記住上一輪迴圈的值,初始化本輪的變數i時,就在上一輪迴圈的基礎上進行計算。
for迴圈中let和var的區別
先看2段 使用var宣告,得到3個3 var a for var i 0 i 3 i a 0 3a 1 3a 2 3 使用let宣告,得到0,1,2 var a for let i 0 i 3 i a 0 0a 1 1a 2 2這是為什麼呢?首先要知道var 宣告作用域是函式作用域,let宣告的作用...
for迴圈中的var和let的區別
for var i 0 i 3 i 30 100 console.log i 先輸出 0 1 2 1 這道題涉及到了非同步 作用域 閉包 settimeout是非同步執行,10ms後往任務佇列裡面新增乙個任務,只有主線上的全部執行完,才會執行任務佇列裡的任務,當主線執行完成後,i是3,所以此時再去執...
let和var在for迴圈中的不同表現
var只有函式作用域,沒有塊級作用域 函式作用域的表現 function test test 10 console.log i i is not defined 塊級作用域對var沒有約束 console.log i 10 從上面的 可了解到,塊級作用域對var是沒有約束作用的。let與var不同,...