zoukankan      html  css  js  c++  java
  • for var let闭包理解

    let、 var、 setTimeout,一点思考。

    for(var i = 0; i < 10; i++){
        setTimeout(function(){
            console.log(i);
        },100);
    }

    结果是很显而易见的,10次都是10,在面试前端的闭包知识时候很常见。 
    用上let之后,

    for(let i = 0; i < 10; i++){
        setTimeout(function(){
            console.log(i);
        },100);
    }

    结果是: 
    0、1、2、3、4、5、6、7、8、9

    为什么var和let声明的i,得到不同的结果?

    var声明的i,作用域不仅仅在for循环内,还在for循环的外部。

    当setTimeout执行的时候,for循环已经完成,i此时的值是10,我们稍微调整一下代码:

    for(var i = 0; i < 10; i++){
        setTimeout(function(){
            consoleLog();
        },100);
    }
    
    function consoleLog(){
        console.log(i);
    }

    结果是10次10。

    for(var i = 0; i < 10; i++)

    var i;
    for(i = 0; i < 10; i++)

    等价。

    但是在let声明的时候则不一样,

    for(let i = 0; i < 10; i++)

    let i;
    for(i = 0; i < 10; i++)

    是不等价的,因为let声明只在代码块中有效。 
    但是,如果仅仅这样,我们或许很容易理解

    for(var i = 0; i < 10; i++){
        setTimeout(function(){
            console.log(i);
        },100);
    }

    得到10次10,然而为什么

    for(let i = 0; i < 10; i++){
        setTimeout(function(){
            console.log(i);
        },100);
    }

    得到0-9?

    在setTimeout的时候,匿名函数function(){console.log(i);}会被声明创建,当匿名函数执行的时候,会查找当前运行环境的 i 的值。 
    var声明的 i ,运行环境的 i 的值为10,但是let声明的 i,运行环境中 i 的值是每一个循环创建匿名函数时候的 i。 
    所以得到了0-9的值。

    let替换var,可以很好的解决闭包的问题。

  • 相关阅读:
    C/C++ 子集生成算法整理
    C++ 求枚举排列的两种方法
    uva1600 Patrol Robot(不同的BFS最短路)
    C++ 已知二叉树两种遍历序列,构建二叉树
    优先队列 C++
    离散化方法
    基本模运算
    C++ 快速幂运算
    病毒通过445端口
    最新勒索软件WannaCrypt病毒感染前后应对措施
  • 原文地址:https://www.cnblogs.com/gopark/p/9492081.html
Copyright © 2011-2022 走看看