zoukankan      html  css  js  c++  java
  • 理解闭包、同步、异步的最好例子

    //每次循环会调用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
  • 相关阅读:
    博客园背景页面动态特效
    windows7 VirtualBox 安装docker异常:looks like something went wrong in step ‘looking for vboxmanage.exe’
    VUE 封装axios 接口
    实时显示系统当前时间时间
    Git 命令执行
    从模型训练中认知拟合现象
    ModernRNN
    Fundamentals of Recurrent Neural Network
    Language Model & Data Sampling
    Text Preprocessing
  • 原文地址:https://www.cnblogs.com/chunshu/p/6426343.html
Copyright © 2011-2022 走看看