理解闭包同步异步的最好例子

Posted 寅春树

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了理解闭包同步异步的最好例子相关的知识,希望对你有一定的参考价值。

//每次循环会调用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

 

以上是关于理解闭包同步异步的最好例子的主要内容,如果未能解决你的问题,请参考以下文章

javascript 中异步回调的结构:同步异步

概念理解之同步,异步,阻塞,非阻塞

js中同步与异步的理解

通俗易懂:一篇文章理解Python异步编程的基本原理

一篇文章理解Python异步编程的基本原理

进程线程同步异步