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,可以很好的解决闭包的问题。

  • 相关阅读:
    vue.js中英文api
    easyui combobox重复渲染问题
    大数据新兴思维
    机器学习技法 之 矩阵分解(Matrix Factorization)
    机器学习技法 之 终章(Final)
    CMake 中文简易手册
    线性判别分析(Linear Discriminat Analysis)
    梯度提升机(Gradient Boosting Machine)之 XGBoost
    机器学习技法 之 梯度提升决策树(Gradient Boosted Decision Tree)
    Host是什么?如何设置host文件?
  • 原文地址:https://www.cnblogs.com/gopark/p/9492081.html
Copyright © 2011-2022 走看看