zoukankan      html  css  js  c++  java
  • let 、const 、var、function声明关键字的新理解

    今天在群里看到大佬们讨论let 、const 的提升问题,有个大佬问

     三种声明都在什么阶段提升? 

    什么阶段?这个真不清楚,以前是只知道let、const存在死区,没有变量提升,一下子就懵了

    后经手动实践发现

    所谓的const、let不存在变量提升只是仅限于表面,但实际上还是会进行预处理。

    创建提升

    const a = 2
    if(true) {
      console.log(a) // Uncaught ReferenceError: Cannot access 'a' before initialization
      const a = 1
    }

    在这段代码中如果if里的a创建不提升,则打印的是a=2,全局变量的2
    但这里报的无法在初始化之前访问a错误,所以const虽说是不提升但还是被预处理了

    可以这么理解

    所谓的创建提升就是把const a 这条语句先进行预处理,给他留一个执行的坑,但实际上const a并没有被执行,a并没有被初始化

    第一人称来看:第四行代码告诉编译器 ,我是const a,我要先给在if这个块头部占个坑,我将在console.log(a)的之后进行初始化,你不能先去找其他的狗子(其他的a),你要等我,但是console.log(a)等不及了,你要让我输出你,但是又不给我值,我要找编译器评理了,然后就丢出错误 ReferenceError: Cannot access 'a' before initialization

    所以我们常说const、 let 推荐在块作用域的最顶部进行使用,可以避免这种事情发生

    初始化提升

    var 、function 存在初始化提升

    原本的初始化,就是语句在那里出现,则在哪里进行初始化,而var function 关键字则存在初始化提升,会自动提升到顶部进行函数声明,也就是我们常说的变量提升

    赋值提升

    赋值提升只有function关键字存在

    通过下面例子可以很清楚的了解到赋值提升

    1 abc()
    2 
    3 function abc(){
    4   console.log('I am abc')
    5 }

    这里的abc()函数调用是可以成功的,因为函数声明和函数体赋值都被提升到了开头,相当于

    function abc(){
      console.log('I am abc')
    }
    abc()

    这些都是很基础的变量提升,唯一的新知识就是创建提升

    总结!划重点

    let、const 在[创建]过程被提升了,但是[初始化]没有提升

    var 的[创建][初始化]都被提升了

    function的 [创建] [初始化] [赋值] 都被提升了

     

  • 相关阅读:
    your account already has a valid ios distribution certificate
    uinavigation样式
    phonegap ios默认启动页
    git init出错
    ios assetlibrary
    uitableviewcell高度自适应笔记
    ios frame bounds applicationframe
    java学习笔记
    file not found while xcode archive
    c++回调
  • 原文地址:https://www.cnblogs.com/liuarui/p/11357369.html
Copyright © 2011-2022 走看看