前言:
對(duì)呀初學(xué)JavaScript的同學(xué)來說,變量提升永遠(yuǎn)都是過不去的坎,相信我們都遇到過這種情況,看下面
問題:
var arr = []; for(var i = 0; i <= 10; i++ ){ arr[i] = function(){
console.log(i)
} } arr[2]()//10
變量i是var命令聲明的,在全局范圍內(nèi)都有效,所以全局只有一個(gè)變量i。每一次循環(huán),變量i的值都會(huì)發(fā)生改變,而循環(huán)內(nèi)被賦給數(shù)組a的函數(shù)內(nèi)部的console.log(i),
里面的i指向的就是全局的i。也就是說,所有數(shù)組a的成員里面的i,指向的都是同一個(gè)i,導(dǎo)致運(yùn)行時(shí)輸出的是最后一輪的i的值,也就是 10。
var arr = []; for(let i = 0; i <= 10; i++ ){
arr[i] = function(){
console.log(i)
}
} console.lg(arr[2]) //2
變量i
是let
聲明的,當(dāng)前的i
只在本輪循環(huán)有效,所以每一次循環(huán)的i
其實(shí)都是一個(gè)新的變量,所以最后輸出的是6
。你可能會(huì)問,如果每一輪循環(huán)的變量i
都是重新聲明的,那它怎么知道上一輪循環(huán)的值,從而計(jì)算出本輪循環(huán)的值?這是因?yàn)?JavaScript 引擎內(nèi)部會(huì)記住上一輪循環(huán)的值,初始化本輪的變量i
時(shí),就在上一輪循環(huán)的基礎(chǔ)上進(jìn)行計(jì)算。
聯(lián)系客服