11 回答

TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超4個(gè)贊
es6:
var items = document.querySelectorAll("li");
for(let i = 0; i<items.length;i++){
items[i].onclick = function(){
console.log(i)
}
}
es5:
var items = document.querySelectorAll("li");
for(var i = 0; i<items.length;i++){
(function(i){
items[i].onclick = function(){
console.log(i)
}
})(i)
}
for循環(huán)直接就運(yùn)行了跑了6次,等你點(diǎn)擊的時(shí)候i已經(jīng)等于5

TA貢獻(xiàn)1848條經(jīng)驗(yàn) 獲得超6個(gè)贊
那for循環(huán)進(jìn)行的時(shí)候,是怎么運(yùn)行的呢?
i=0時(shí),是console.log(0) 嗎 還是console.log(i)?
for 循環(huán)在你一打開,或者瀏覽器一編譯的時(shí)候,已經(jīng)運(yùn)行了。由于你沒點(diǎn)擊,于是沒有觸發(fā) console.log(i);
i 是全局的 i; 是 for()里面的i;所以點(diǎn)擊 item[i]會(huì)打印出循環(huán)6次結(jié)束的 i.

TA貢獻(xiàn)1848條經(jīng)驗(yàn) 獲得超2個(gè)贊
var items;
var i;
items = document.querySelectorAll("li");
for(i = 0; i<items.length;i++){
items[i].onclick = function(){
console.log(i)
}
}
這樣拆開,其實(shí)都一樣的,for循環(huán)是沒有作用域的,var定義的變量會(huì)提升到外面。這樣最后i就是6,你點(diǎn)擊的時(shí)候輸出就是6.

TA貢獻(xiàn)1798條經(jīng)驗(yàn) 獲得超3個(gè)贊
var items = document.querySelectorAll("li");
for (var i = 0; i < items.length; i++) {
items[i].onclick = function () {
console.log(i)//永遠(yuǎn)是6
console.log($(this).index())//打印當(dāng)前點(diǎn)擊的元素的索引
}
}

TA貢獻(xiàn)2039條經(jīng)驗(yàn) 獲得超8個(gè)贊
var items = document.querySelectorAll("li");
for(var i = 0; i<items.length;i++){
items[i].index=i;
items[i].onclick = function(){
console.log(this.index)
}
}
不是閉包,for循環(huán)又不等你點(diǎn)擊的時(shí)候才循環(huán),當(dāng)然都是最后一個(gè)

TA貢獻(xiàn)1789條經(jīng)驗(yàn) 獲得超8個(gè)贊

TA貢獻(xiàn)1757條經(jīng)驗(yàn) 獲得超8個(gè)贊
最簡單的,把 var 改成塊級作用域.
for(let i = 0; i<items.length;i++){
items[i].onclick = function(){
console.log(i)
}
}

TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超11個(gè)贊

TA貢獻(xiàn)1773條經(jīng)驗(yàn) 獲得超3個(gè)贊

TA貢獻(xiàn)1875條經(jīng)驗(yàn) 獲得超5個(gè)贊
這個(gè)涉及到j(luò)s作用域以及js的運(yùn)行機(jī)制。你把這些基礎(chǔ)知識(shí)弄明白了,就不會(huì)感覺奇怪了。
在es6之前是沒有塊級作用域的概念的,只有全局作用域和函數(shù)作用域,所以這里有兩種作用域,click回調(diào)的函數(shù)作用域,全局作用域(for循環(huán)不會(huì)產(chǎn)生塊級作用域),也就是說i屬于全局作用域。click回調(diào)里面調(diào)用了i值,但里面并沒有定義,這個(gè)變量就叫做自由變量,js對自由變量取值的邏輯是會(huì)沿著作用域鏈向上尋找,直到找到值,或找不到值為止,當(dāng)你點(diǎn)擊觸發(fā)回調(diào)的時(shí)候,函數(shù)作用域內(nèi)沒有該變量就會(huì)向上尋找,即全局作用域,此時(shí)全局作用域中的i值已經(jīng)為6了(這一點(diǎn)看明白,很重要)。所以你log數(shù)出來的每次都是6。
添加回答
舉報(bào)