setTimeout( function timer(){ console.log( i ); }, i*1000 ); var i=2; setTimeout( function timer(){ console.log( i ); }, i*1000 ); var i=3; setTimeout( function timer(){ console.log( i ); }, i*1000 ); var i=4; setTimeout( function timer(){ console.log( i );...
for(var i=;i<5;i++){ (function(i){ setTimeout(()=>{ console.log(i); }, 0); })(i) } 1. 2. 3. 4. 5. 6. 7. for (var i = 0; i < 5; i++) { (() => { var privateI = i; setTimeout(() => { console.log(privateI); }, 0); })() } 1. 2. 3. 4...
for(let i = 0; i < 5; i++) { setTimeout(function() { console.log(i); },1000 *i); } 为什么let就行而var不行呢?因为let的作用域是块作用域,所以每次JS检测到setTimeOut把setTimeOut放到队列的同时,let定义的i的值也会跟随setTimeOut进去队列。所以每次循环后队列里的setTimeOut里的i的值是...
(function(i){ setTimeout(()=>{ console.log(i); }, 0); })(i) }<br><br><br>for(vari = 0; i < 5; i++) { (() => { varprivateI = i; setTimeout(() => { console.log(privateI); }, 0); })() } 第二种 使用let ...
for (var i = 0; i < 5; i++) { (function(index) { setTimeout(function() { console.log(index); }, 1000 * index); })(i); } 在上述示例中,我们使用了一个立即执行函数来创建了一个独立的作用域,并将循环变量i作为参数传递给该函数。这样每个定时器都会在独立的作用域中获取到对应的索引值...
因为同步队列的for循环执行完成才轮到异步队列, 每一次for循环的时候,settimeout都执行一次,但是里面的function(闭包函数)没有被执行,而是被放到了任务队列里面,等待执行,当i累加到5的时候跳出循环。此时全局只有一个变量i=>5,所以打印出来都是5。
vartimeoutID=scope.setTimeout(function[,delay,arg1,arg2,...]);附加参数,一旦定时器到期,它们会作为参数传递给[`function`] for(vari=0;i<5;i++){setTimeout((j)=>{console.log(j);},0,i);} 这种方式通过setTimeOut的第三个参数,把传递给setTimeOut回调函数的执行环境中。
currentIndex]; } } }; var timerLogic=function(){ var value=this.next(); if(Object.prototype.toString.call(value)==="[object Undefined]"){ console.log("done"); }else{ console.log(value); setTimeout(timerLogic,0) } }.bind(arrayIteratpr); setTimeout(timerLogic,0); 有用 回复 ...
所谓本质上是作用域问题,在我理解上就是目前根据for循环遍历出五个 setTimeout,每个setTimeout在运行的时候都会将function函数压入队列,但是由 于var声明的变量在全局环境都会被调用,所以在执行压入下一个function的时 候,会改变上一个已经压入队列的function中的变量i,所以最后会打印五个5. ...
setTimeout是一次执行函数,这里是1秒后执行,仅仅执行一次;for(var i=0;i<10;i++),i的每次取值都是执行setTimeout这个函数,并没有执行setTimeout里面的function(即闭包函数),setTimeout里面的function是有setTimeout的定时触动的,也就是1秒后执行,也就是说i从0~9时,一共执行了10次的set...