zoukankan      html  css  js  c++  java
  • 关于 es6的 let 特性在 for 循环结构 的个人理解

    文章摘抄自https://www.jianshu.com/p/8f890da2d8bc

    1:var a=[];

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

    a[i]=function(){console.log(i);};

    }

    a[6]();//10

    2  :var a=[];

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

    a[i]=function(){console.log(i);};

    }

    a[6]();// 6

    let 声明的变量只在 块级作用域内有效,so 上面的 let 代码块,可以这么理解:

    for循环里的 ()和 { } 合起来是 一个大的块级作用域,并且()是父级作用域,{ }是个单独的子级作用域,每次循环会创建一个新的【()和 { }】 合起来的一个大的块级作用域状态,所以每次 i 的值都对应一个新的大的块级作用域的状态,大的块级作用域的状态下的 { } 子级作用域之间是相互独立的,并且每次()父级作用域会记住上次循环的父级作用域内的循环变量的值,然后基于此值计算本次循环变量的值,以此类推,直至循环结束。

    函数在调用的时候,会去函数定义的地方沿着作用域链向上以类似DOM树的冒泡的方式查找变量的值:(以下的父级函数作用域都是在 如果有的情况下 发生)

        var的情况是: 子级函数作用域-> 父级函数作用域->全局作用域;

        let的情况是:子级函数作用域->块级作用域[{子 } -> (父)]->父级函数作用域->全局作用域;

        let的情况类似之前的闭包:子级函数作用域->父级函数作用域->全局作用域;


    别人总结的太好了
  • 相关阅读:
    2012搜狗校园招聘笔试题(2)
    T-SQL中只截取日期的日期部分和日期的时间部分
    Delphi XE4 TStringHelper用法详解
    TScreen 类
    TScreen 类
    Delphi中Form的position属性与代码自定义窗体位置
    如何让窗口显示在电脑屏幕中间
    C#中整型数据类型
    C# WinForm开发系列
    SQL中EXCEPT和Not in的区别?
  • 原文地址:https://www.cnblogs.com/xufeng1994/p/10473271.html
Copyright © 2011-2022 走看看