为了赞助大年夜家懂得,再来一个结合变量晋升的加倍复杂的例子。如不雅你可以或许精确看出履行次序,那么你对于函数的履行就有了比较精确的熟悉了,如不雅还不克不及,就回过火去看看其他几篇文┞仿。
- setTimeout(function() {
- console.log(a);
- }, 0);
- var a = 10;
- console.log(b);
- console.log(fn);
- var b = 20;
- function fn() {
- setTimeout(function() {
- console.log('setTImeout 10ms.');
- }, 10);
- }
- fn.toString = function() {
- return 30;
- }
- console.log(fn);
- setTimeout(function() {
- console.log('setTimeout 20ms.');
- }, 20);
- fn();
上栗履行结不雅
OK,关于setTimeout就临时先介绍到这里,我们回过火来看看那个轮回闭包的思虑题。
- for (var i=1; i<=5; i++) {
- setTimeout( function timer() {
- console.log(i);
- }, i*1000 );
- }
如不雅我们直接如许写,根据setTimeout定义的操作在函数调用栈清空之后才会履行的特点,for轮回里定义了5个setTimeout操作。而当这些操作开端履行时,for轮回的i值,已经先一步变成了6。是以输出结不雅总为6。而我们想要让输出结不雅依次履行,我们就必须借助闭包的特点,每次轮回时,将i值保存在一个闭包中,当setTimeout中定义的操作履行时,则拜访对应闭包保存的i值即可。
而我们知道在函数中闭包剖断的准则,即履行时是否在内部定义的函数中拜访了上层感化域的变量。是以我们须要担保一层自履行函数为闭包的形成供给前提。
是以,我们只须要2个操作就可以完成标题需求,一是应用自履行函数供给闭包前提,二是传入i值并保存在闭包中。
- for (var i=1; i<=5; i++) {
- (function(i) {
- setTimeout( function timer() {
- console.log(i);
- }, i*1000 );
- })(i)
- }
应用断点调试,在chrome中查看履行次序与每一个闭包中不合的i值
当然,也可以在setTimeout的第一个参数处应用闭包。
- for (var i=1; i<=5; i++) {
- setTimeout( (function(i) {
- return
推荐阅读
近日,美国贸易资本企业“专家市场”公司宣布2017年度全球最大年夜科技城市排名,北京因中关村位列榜首,代替硅谷成为全球最大年夜的科技中间。而客岁排名第一的柏林本年跌至第>>>详细阅读
本文标题:图例详解那道setTimeout与循环闭包的经典面试题
地址:http://www.17bianji.com/lsqh/38486.html
1/2 1