理解闭包、同步、异步的最好例子
2017-02-21 21:23
302 查看
//每次循环会调用setTimeout函数,其中指定了一个timeout后执行的函数 //这个函数因为构成闭包的关系,其能够访问外层函数定义的变量,这个变量就是i //在for循环执行完毕后,i的值为10.此时在事件队列中有10个timeout函数等待执行 //当timeout时间到时,对应的执行函数调用的i都是同一个,也就是10 for(var i=0;i<10;i++){ setTimeout(function() { console.log(i); }, 1000); } //10 输出10次10
//在for循环中定义了匿名立即执行函数 //通过将每次循环时产生i传入匿名立即执行函数,立即执行函数就有了一个内部变量e, //其值是传入的i //setTimeout函数形成闭包,能访问到其外层函数也就是匿名立即执行函数的变量e //因为e引用关系的存在,匿名立即执行函数不会被马上销毁掉 //timeout时间一到,指定执行函数调用的e就是每次传入的参数i for(var i=0;i<10;i++){ (function(e) { setTimeout(function() { console.log(e); }, 1000); })(i); } //0~9
//整个和上面的类似,只不过把匿名立即执行函数传递给setTimeout的第1个参数中 //匿名立即执行函数,顾名思义就是需要立即执行的呀。 //所以setTimout函数对应的超时执行函数(第1个参数) //为匿名立即执行函数执行的结果,也就是返回的函数。 //接下来理解就和上面一样啦 for(var i=0;i<10;i++){ setTimeout((function(e) { returnfunction() { console.log(e); } })(i), 1000) } //0~9
//第一个for这样写也能得到0~9: for(let i = 0; i < 10; i++) { setTimeout(function() { console.log(i); }, 1000); } //ECMAScript6的let和const见 http://es6.ruanyifeng.com/#docs/let[/code]
相关文章推荐
- 从几个例子理解串行并行队列及同步异步任务
- 对于同步、异步、阻塞、非阻塞的几点理解
- 关于同步、异步、阻塞、非阻塞一个通俗易懂的例子
- Node.js的学习历程二同步异步调用等基础知识的理解
- 异步与同步的理解
- 同步与异步、阻塞与非阻塞的理解
- 怎样理解阻塞非阻塞与同步异步的区别?
- 怎样理解阻塞非阻塞与同步异步的区别?
- 怎样理解阻塞非阻塞与同步异步的区别?
- js 同步和异步 的理解
- 怎样理解阻塞非阻塞与同步异步的区别?
- 【转载】怎样理解阻塞非阻塞与同步异步的区别?
- 阻塞与非阻塞,同步与异步的理解
- 怎样理解阻塞非阻塞与同步异步的区别
- JavaScript同步、异步、回调执行顺序之经典闭包(setTimeout面试题分析)
- 深入理解AJAX系列第三篇--async属性值之同步和异步及同步和异步区别
- (转)理解javascript的同步与异步模式
- 深入理解JavaScript编程中的同步与异步机制
- .NET 同步与异步 之 警惕闭包(十)
- 异步 的 twisted , 按照同步的思路去写代码 例子