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的 [创建] [初始化] [赋值] 都被提升了

     

  • 相关阅读:
    Balanced Binary Tree
    Convert Sorted List to Binary Search Tree
    Convert Sorted Array to Binary Search Tree
    Binary Tree Zigzag Level Order Traversal
    Validate Binary Search Tree
    Binary Tree Level Order Traversal II
    Binary Tree Level Order Traversal
    Maximum Depth of Binary Tree
    如何把U盘的两个盘或者多个盘合成一个
    bugku 想蹭网先解开密码
  • 原文地址:https://www.cnblogs.com/liuarui/p/11357369.html
Copyright © 2011-2022 走看看