`
yeak2001
  • 浏览: 101077 次
  • 性别: Icon_minigender_1
  • 来自: 无锡
社区版块
存档分类
最新评论

在循环中使用setTimeout

阅读更多
  首先,我想说下闭包.何为闭包,闭包是指内层的函数可以引用存在于包围它的函数内的变量,即使外层函数执行已经终止.
  其次是JS的线程问题,JS是单线程的,意味着同一时间只能执行一条语句,所以每个JS执行代码块都会阻塞异步事件的执行,这就意味着当一个异步(鼠标点击事件,AJAX,SETTIMEOUT)发生的时候,他们将排在执行队列的最后等待执行.
  最后说下setTimeout,setTimeout有2种形式:
     setTimeout(code,interval)
    setTimeout(func,interval,args)
其中code是一个字符串,这里会用到EVAL()将字符串转换成JS代码执行
func是一个函数
注意"函数"的意义,是一个表达式,而不是一个语句(执行函数)
比如你想周期性的执行一个函数
function aa() {
   //todo something
}
setTimeout("aa()",1000);
或setTimeout(a,1000);

注意第二种写法不能写成a()

在循环中使用setTimeout:
function testAnonymous() {
   var aa = 0;
   var bb = 1;
   for(var i = 0; i < 10; i++) {
      aa++;
      bb++;
      setTimeout("testDisplay(" + aa + "," + bb + ")",1000);
      //setTimeout(function(){return testDisplay(aa,bb);},1000);
    }
}
			
function testDisplay(aa,bb) {
  alert("this is aa = " + aa + " and bb = " + bb);
}

在循环中用字符串拼接的形式可以成功的执行,但是用闭包就会出现每次ALERT出来的结果都是一样的.这是为什么呢?回到刚才说的setTimeout的机制,用字符串拼接的方式每次排队等待的函数里的参数都得到了正确的初始化,而匿名函数里在进入等待队列的时候还没有执行,以至于函数体里的函数参数并没有被初始化,等到FOR循环结束,再执行匿名函数的时候aa和bb的值已经是最后一次的值了,所以不管怎么ALERT都是一样的结果.

字符串拼接的代码是比较丑陋,但是某些时候也没有其他办法可以解决,如果不在循环中,完全可以用闭包的形式来替代字符串拼接,这样能够更好的组织代码,使代码看上去更直观.
2
0
分享到:
评论
2 楼 yeak2001 2009-11-19  
不好意思啊,我最近比较忙,一直没上来看看
你的问题其实是这样的
在循环中你使用了setTimeout但是设置的间隔时间是100ms
JS是单线程的,他不会立刻执行,因为在这个setTimeout方法执行的时候FOR循环还在执行,所以他必须得在FOR循环完以后再会执行,也就是排入了等待队列,然后呢,你每次都是在100MS以后执行,这个100MS不是个累加的100MS,也就是永远都是100MS,所以等FOR循环执行完以后的100MS就会一次性执行draw 365次,修改办法是setTimeout("draw(" + i + ")", 100*i),时他们每次执行的时间有间隔就可以了

1 楼 FinrodElensar 2009-10-16  
<script>
//我想可以直观的看到用点画圆的效果,用setTimeout()方法
function draw(i)
{
    var ele=document.createElement("<div>");
    var a=300-100*Math.sin(i);//(300,100)为圆心的坐标left:300px;top:300px; 半径       //为:100
    var b=300-100*Math.cos(i);
    a=a.toString();
    b=b.toString();
    ele.style.position="absolute";
    ele.style.left=a;
    ele.style.top=b;
    ele.innerText=".";
    document.body.insertBefore(ele)'
}
</script>
<script>
for(i=0;i<360;i++)
{
   setTimeout("draw("+i+")",100);
}
//本来想隔100ms画一个点的,结果是100ms后就把整个圆画成了...,大大能解释是什么原因吗,先谢谢了.
</script>

相关推荐

    for循环 + setTimeout 结合一些示例(前端面试题)

    最近在翻看以前的老书《node.js开发指南》,恰好碰到 for 循环 + setTimeout 的经典例子,于是重新梳理了思路并记录下。 二、写在前面,setTimeout 和 setInterval 的执行机制 在日常编码中,你会发现,给 ...

    Javascript中setTimeOut和setInterval的定时器用法

    setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式,而setInterval()则是在每隔指定的毫秒数循环调用函数或表达式,直到clearInterval把它清除。也就是说setTimeout()只执行一次,setInterval()可以执行多...

    JavaScript中停止执行setInterval和setTimeout事件的方法

    js 代码中执行循环事件时,经常会用到 setInterval 和 setTimeout 这两个方法,关于这两个方法的细节这里不详细讨论了,简要分享下在需要停止循环事件的时候该如何操作。 (1)setInterval 方法可按照指定的周期(以...

    js中setTimeout的妙用–防止循环超时

    上个周日,介绍了如何使用setTimeout代替setInterval进行间歇调用,这个周日,继续来讲《JavaScript高级程序设计》这本书里面,对于setTimeout的另一种妙用——防止循环超时  【这是铺垫,为故事的高潮埋下伏笔】 ...

    设置setTimeout延时为0ms的作用

    而setTimeout函数是异步的,异步的事件会加入一个队列,会等到当前同步的任务执行完毕后,再执行setTimeout队列的任务。所以,通过设置任务在延迟0毫秒后执行,就能改变任务执行的先后顺序,延迟该任务发生,改变它...

    javascript中SetInterval与setTimeout的定时器用法

    setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式,而setInterval()则是在每隔指定的毫秒数循环调用函数或表达式,直到clearInterval把它清除。也就是说setTimeout()只执行一次,setInterval()可以执行多...

    微信小程序中使用Promise进行异步流程处理的实例详解

    微信小程序中使用Promise进行异步流程处理的实例详解 我们知道,JavaScript是单进程执行的,同步操作会对程序的执行进行阻塞处理。比如在浏览器页面程序中,如果一段同步的代码需要执行很长时间(比如一个很大的循环...

    Js中setTimeout()和setInterval() 何时被调用执行的用法

    setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式,而setInterval()则可以在每隔指定的毫秒数循环调用函数或表达式,直到clearInterval把它清除。从定义上我们可以看到两个函数十分类似,只不过前者执行一...

    javascript中interval与setTimeOut的区别示例介绍

    setTimeout(code,millisec) //- 在指定时间后执行代码 code必须; millisec必须; clearTimeout(setTimeoutId) //- 取消 setTimeout() setInterval(code,millisec);//指定间隔毫秒内循环执行代码 code必须; ...

    Js setInterval与setTimeout(定时执行与循环执行)的代码(可以传入参数)

    最近在做项目时用到了定时执行的js方法,setInterval与setTimeout时间长了不用有些生疏了,所以自己总结了一下,记下来,以便以后使用。

    jQuery及JS实现循环中暂停的方法

    jquery对数组进行循环,如果要求每次循环的时候暂停2秒钟,在使用jQuery的.earch循环的时候,无论怎么设置,都不会暂停。 setTimeout也只是在第一次执行的时候暂停。 原因猜测: js开始执行多线程? 改进: 改为...

    写一个JavaScript框架:比setTimeout更棒的定时执行

    你将了解定时器和事件循环之间的不同差异,比如 setTimeout和Promises。 这个系列是关于一个开源的客户端框架,叫做NX。在这个系列里,我主要解释一下写该框架不得不克服的主要困难。如果你对 NX感兴趣可以参观我们...

    JavaScript代码实现图片循环滚动效果

    循环滚动图片,不仅可以增添Web页面的动态效果,而且可以节省页面空间,有效地保证在有限的页面中显示更多的图片。 2.技术要点 主要应用setTimeout()方法实现图片的循环滚动效果。setTimeout()方法的语法格式如下:...

    全栈开发—首页模块1.zip

    2)在代码执行的过程中,如果遇到宏任务,如: setTimeout ,就会将当前任务分发到对应的执行队 列中去。 3)当执行过程中,如果遇到微任务,如: Pomise ,在创建 Promise 实例对象时,代码顺序执行,如果 到了执行...

    JS定时器使用,定时定点,固定时刻,循环执行详解

    JavaScript中有两个定时器方法:setTimeout()和setInterval()。 这两个方法都可以用来实现在一个固定时间段之后去执行JavaScript。实际上,setTimeout和setInterval的语法相同。它们都有两个参数,一个是将要...

    微信小程序中使用Promise进行异步流程处理

    比如在浏览器页面程序中,如果一段同步的代码需要执行很长时间(比如一个很大的循环操作),则页面会产生卡死的现象。 所以,在JavaScript中,提供了一些异步特性,为程序提供了性能和体验上的益处,比如可以将代码...

    JavaScript定时器使用方法详解

    2、定时执行(一次定时器):某一段程序需要在延迟多少时间后执行【setTimeout()】【clearTimeout()】 定时器使用 使用注意:为了防止定时器累加,使用定时器要先清除后设置;要保证内存中只有一个定时器。 1、循环...

    JavaScript中的定时器之Item23的合理使用

    在javascritp中,有两个关于定时器的专用函数,它们是:  1.倒计定时器:timename=setTimeout(“function();”,delaytime);  2.循环定时器:timename=setInterval(“function();”,delaytime);  1、定时器概述 ...

    实例分析js事件循环机制

    本文通过实例给大家详细分析了JS中事件循环机制的原理和用法,以下是全部内容: var start = new Date() setTimeout(function () { var end = new Date console.log('Time elapsed:', end - start, 'ms') }, 500)...

Global site tag (gtag.js) - Google Analytics