zoukankan      html  css  js  c++  java
  • 深入理解let和var的区别

    首先我们应该知道js引擎在读取js代码时会进行两个步骤:

    • 第一个步骤是解释。
    • 第二个步骤是执行。

    所谓解释就是会先通篇扫描所有的Js代码,然后把所有声明提升到顶端,第二步是执行,执行就是操作一类的。

    我们先来看个简单的变量提升案例吧

    
        a = 'javascript';
        var a;
        console.log(a);//'javascript'
    
    
        console.log(b);//undefined
        var b='javascript'
    

    遇到 script 标签的话 js 就进行预解析,将变量 var 和 function 声明提升,但不会执行 function,然后就进入上下文执行,上下文执行还是执行预解析同样操作,直到没有 var 和 function,就开始执行上下文。如:

    
    a=5;
    show();
    var a;
    function show(){};
    

    预解析:

    
    function show(){};
    var a;
    a=5;
    show();
    

    需要注意都是函数声明提升直接把整个函数提到执行环境的最顶端。

    那么let/const和var又有什么区别呢??

    • let/const是使用区块作用域;var是使用函数作用域。
    • 在let/const声明之前就访问对应的变量与常量,会抛出ReferenceError错误;但在var声明之前就访问对应的变量,则会得到undefined。
    
    console.log(aVar) // undefined
    console.log(aLet) // causes ReferenceError: aLet is not defined
    var aVar = 1
    let aLet = 2
    

    会出现这样的情况是因为let/const拥有“暂时性死区(TDZ)”。

    什么是暂时性死区?

    当程序的控制流程在新的作用域(module, function或block作用域)进行实例化时,在此作用域中的用let/const声明的变量会先在作用域中被创建出来,但因此时还未进行词法绑定,也就是对声明语句进行求值运算,所以是不能被访问的,访问就会抛出错误。所以在这运行流程一进入作用域创建变量,到变量开始可被访问之间的一段时间,就称之为TDZ(暂时死区)。

    结论:let/const声明的变量,的确也是有提升(hoist)的作用。这个是很容易被误解的地方,实际上以let/const声明的变量也是会有提升(hoist)的作用。提升是JS语言中对于变量声明的基本特性,只是因为TDZ的作用,并不会像使用var来声明变量,只是会得到undefined而已,现在则是会直接抛出ReferenceError错误,而且很明显的这是一个在运行期间才会出现的错误。

    ES6 规定暂时性死区和let、const语句不出现变量提升,主要是为了减少运行时错误,防止在变量声明前就使用这个变量,从而导致意料之外的行为。这样的错误在 ES5 是很常见的,现在有了这种规定,避免此类错误就很容易啦~

    原文地址:https://segmentfault.com/a/1190000017352156
  • 相关阅读:
    《C# to IL》第一章 IL入门
    multiple users to one ec2 instance setup
    Route53 health check与 Cloudwatch alarm 没法绑定
    rsync aws ec2 pem
    通过jvm 查看死锁
    wait, notify 使用清晰讲解
    for aws associate exam
    docker 容器不能联网
    本地运行aws lambda credential 配置 (missing credential config error)
    Cannot connect to the Docker daemon. Is 'docker daemon' running on this host?
  • 原文地址:https://www.cnblogs.com/datiangou/p/10112905.html
Copyright © 2011-2022 走看看