作家
登录

图例详解那道setTimeout与循环闭包的经典面试题

作者: 来源: 2017-11-06 14:21:48 阅读 我要评论

为了赞助大年夜家懂得,再来一个结合变量晋升的加倍复杂的例子。如不雅你可以或许精确看出履行次序,那么你对于函数的履行就有了比较精确的熟悉了,如不雅还不克不及,就回过火去看看其他几篇文┞仿。

  1. setTimeout(function() { 
  2.     console.log(a); 
  3. }, 0); 
  4.   
  5. var a = 10; 
  6.   
  7. console.log(b); 
  8. console.log(fn); 
  9.   
  10. var b = 20; 
  11.   
  12. function fn() { 
  13.     setTimeout(function() { 
  14.         console.log('setTImeout 10ms.'); 
  15.     }, 10); 
  16.   
  17. fn.toString = function() { 
  18.     return 30; 
  19.   
  20. console.log(fn); 
  21.   
  22. setTimeout(function() { 
  23.     console.log('setTimeout 20ms.'); 
  24. }, 20); 
  25.   
  26. fn();  

上栗履行结不雅

OK,关于setTimeout就临时先介绍到这里,我们回过火来看看那个轮回闭包的思虑题。

  1. for (var i=1; i<=5; i++) { 
  2.     setTimeout( function timer() { 
  3.         console.log(i); 
  4.     }, i*1000 ); 
  5.  

如不雅我们直接如许写,根据setTimeout定义的操作在函数调用栈清空之后才会履行的特点,for轮回里定义了5个setTimeout操作。而当这些操作开端履行时,for轮回的i值,已经先一步变成了6。是以输出结不雅总为6。而我们想要让输出结不雅依次履行,我们就必须借助闭包的特点,每次轮回时,将i值保存在一个闭包中,当setTimeout中定义的操作履行时,则拜访对应闭包保存的i值即可。

而我们知道在函数中闭包剖断的准则,即履行时是否在内部定义的函数中拜访了上层感化域的变量。是以我们须要担保一层自履行函数为闭包的形成供给前提。

是以,我们只须要2个操作就可以完成标题需求,一是应用自履行函数供给闭包前提,二是传入i值并保存在闭包中。

  1. for (var i=1; i<=5; i++) { 
  2.   
  3.     (function(i) { 
  4.         setTimeout( function timer() { 
  5.             console.log(i); 
  6.         }, i*1000 ); 
  7.     })(i) 
  8.  

应用断点调试,在chrome中查看履行次序与每一个闭包中不合的i值

当然,也可以在setTimeout的第一个参数处应用闭包。

  1. for (var i=1; i<=5; i++) {  
  2.    setTimeout( (function(i) { 
  3.         return

      推荐阅读

      2017年度全球最大科技城市排名出炉,北京取代硅谷位列第一

    近日,美国贸易资本企业“专家市场”公司宣布2017年度全球最大年夜科技城市排名,北京因中关村位列榜首,代替硅谷成为全球最大年夜的科技中间。而客岁排名第一的柏林本年跌至第>>>详细阅读


    本文标题:图例详解那道setTimeout与循环闭包的经典面试题

    地址:http://www.17bianji.com/lsqh/38486.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)