image.png
當(dāng)你在for循環(huán)里寫if判斷,再加延時器或者定時器時百拓,一定要保存當(dāng)前的i的值,再做處理晰甚,否則你拿到的i的值會是for循環(huán)里最大的那個衙传;
for (var i = 0; i < 10; i++) {
if(i == 5){
setTimeout(aa,2000);
function aa(){
console.log( "i="+i);
}
}
} //10
for (var i=0; i<5;i++) {
(function(){ //5
setTimeout(function(){
console.log(i)
},i*1000)
})(i);
}
for (var i=0; i<5;i++) {
(function(){
var k=i;
setTimeout(function(){
console.log(k)
},i*1000)
})(i);
}
你們覺得會打印出i的值是幾?
最終結(jié)果會是10厕九!
延時器換做定時器蓖捶, 最終結(jié)果也是一樣的;
那么為什么呢扁远?
js讀取代碼是從上向下讀取的俊鱼,當(dāng)它讀取到i滿足if語句的時候并不是停止了刻像,還會繼續(xù)做循環(huán)判斷;而此時if語句里面是一個延時器并闲,當(dāng)延時器的延時時間結(jié)束要調(diào)用aa函數(shù)的時候细睡,for循環(huán)已經(jīng)循環(huán)結(jié)束,而此時的i已經(jīng)變?yōu)?0帝火;
所以打印出來i的值就會是10溜徙;
那么怎么解決這個問題呢?看代碼
var j = null;
for (var i = 0; i < 10; i++) {
if(i == 5){
j = i;
setTimeout(aa,2000);
function aa(){
console.log( "i="+j);
}
}
}
// var number=50;
// var obj={
// number:60,
// getnum:function(){
// var number=70;
// return this.number
// }
// }
// console.log(obj.getnum()) //60 obj
// console.log(obj.getnum.call()) //50 window
// console.log(obj.getnum.call({number:20})) //20
這樣打印出來的就是我們想要的結(jié)果了犀填,沒錯就是5蠢壹;
原理就是當(dāng)滿足if語句時,我們用一個變量把當(dāng)前i的值保存下來九巡;
循環(huán)
// tip 遍歷下標(biāo)
$('.m25-x-tpp2 .m25-x-ulcom li').each( function(i, e){ $(this).attr("fenge",i) });
js
https://blog.csdn.net/wxl1555/article/details/53719659
call
https://blog.csdn.net/ganyingxie123456/article/details/70855586