应用闭包,修改下面的代码,绕揭捉?环输出的结不雅依次为1, 2, 3, 4, 5
- for (var i=1; i<=5; i++) {
- setTimeout( function timer() {
- console.log(i);
- }, i*1000 );
- }
值得高兴的是很多同伙在读了文┞仿之后确切对闭包有了加倍深刻的懂得,并精确的给出了几种写法。一些同伙可以或许卖力的浏览我的文┞仿并且一个例子一个例子的上手演习,这种承认对我而言真的异常冲动。然则也有一些基本稍差的同伙在浏览了之后,对于这题的懂得仍然认为困惑,是以应一些读者老爷的请求,借此文┞仿专门对setTimeout进行一个相干的常识分享,愿大年夜家读完之后都可以或许有新的收成。
我在具体图解感化域链竽暌闺闭包一文中的结尾留下了一个关于setTimeout与轮回闭包的思虑题。
- setTimeout(function() {
- console.log('一秒钟之后我将被打印出来')
- }, 1000)
可能不少人对于setTimeout的懂得止步于此,但照样有不少人发清楚明了一些其他的器械,并在评论里提出了疑问。比瘸老图中的┞封个数字7,是什么?
每一个setTimeout在履行时,会返回一个独一ID,上图中的数字7,就是这个独一ID。我们在应用时,经常会应用一个变量将这个独一ID保存起来,用以传入clearTimeout,清除准时器。
- var timer = setTimeout(function() {
- console.log('如不雅不清除我,我将会一秒之后出现。');
- }, 1000)
- clearTimeout(timer); // 清除之后,经由过程setTimeout定义的操作并不会履行
上例履行结不雅
接下来,我们还须要推敲别的一个重要的问题,那就是setTimeout中定义的操作,在什么时刻履行?为了引起大年夜家的看重,我们来看看下面的例子。
- var timer = setTimeout(function() {
- console.log('setTimeout actions.');
- }, 0);
- console.log('other actions.');
- // 思虑一下,当我将setTimeout的延迟时光设置为0时,膳绫擎的履行次序会是什么?
在浏览器中的console中运行尝尝看,很轻易就可以或许知道谜底,如不雅你没有估中谜底,那么我这篇文┞仿就值得你点一个赞了,因为接下来我分享的小常识,可能会在笔试中救你一命。
在对于履行高低文的介绍中,我与大年夜家分享了函数调用栈这种特别数据构造的调用特点。在这里,将会介绍别的一个特别的队列构造,页面中所有由setTimeout定义的操作,都将放在同一个队列中依次履行。
我用下图跟大年夜家展示一下队列数据构造的特点。
队列:先辈先出
而这个队列履行的时光,须要等待到函数调用栈清空之后才开端履行。即所有可履行代码履行完毕之后,才会开端履行由setTimeout定义的操作。而这些操作进入队列的次序,则由设定的延迟时光来决定。
在最初进修setTimeout的时刻,我们很轻易知道setTimeout有两个参数,第一个参数为一个函数,我们经由过程该函数定义将要履行的操作。第二个参数为一个时光毫秒数,表示延迟履行的时光。
是以在膳绫擎这个例子中,即使我们将延迟时光设置为0,它定义的操作仍然须要等待所有代码履行完毕之后才开端履行。这里的延迟时光,并非相对于setTimeout履行这一刻,而是相对于其他代码履行完毕这一刻。所以膳绫擎的例子履行结不雅就异常轻易懂得了。
推荐阅读
近日,美国贸易资本企业“专家市场”公司宣布2017年度全球最大年夜科技城市排名,北京因中关村位列榜首,代替硅谷成为全球最大年夜的科技中间。而客岁排名第一的柏林本年跌至第>>>详细阅读
本文标题:图例详解那道setTimeout与循环闭包的经典面试题
地址:http://www.17bianji.com/lsqh/38486.html
1/2 1