zoukankan      html  css  js  c++  java
  • var重复声明为什么后续声明会被忽略

    var a = 1
    var a
    console.log(a)
    

    上面这段代码输入1,为什么第二次声明没有覆盖第一次声明呢?

    var a = 1
    var a = 2
    console.log(a)
    

    上面这段代码输出2,这里为什么第二次声明又覆盖了第一次声明呢?

    这要从js代码运行机制说起:
    在JS代码运行过程中:
    引擎负责整个代码的编译和执行,编译器负责语法分析、词法分析、代码生成等,而作用域则负责维护所有的标识符(变量)
    当执行上面的代码时,可以简单的理解为给新变量分配一块内存,命名为a,并赋值为1;但在运行的时候编译器与引擎还会进行两项额外的操作,即判断变量是否已经声明:
    1.首先编译器对代码拆解,从左往右遇到了var a, 然后去询问作用域是否存在这个变量,如果不存在就让作用域声明一个新的变量a,如果存在就忽略var继续往下编译,这时a=1被编译成可执行的代码供引擎使用
    2.引擎遇见a=1时也会去询问作用域是否存在这个变量,若存在,则赋值为1,若不存在,就沿着作用域往上查找,若找到了,赋值为1,若没找到,让作用域声明一个新的变量a

    用代码解释上述执行过程就是:

    var a
    a = 1
    //  var a  忽略
    console.log(a)
    
    var a
    a = 1
    //  var a  忽略
    a = 2
    console.log(a)
    
  • 相关阅读:
    [转]ABAP动态取得数据
    [转]ABAP学习笔记之三内表
    [转]ABAP实现对变式的修改
    [转]ABAP Search help
    C#中访问私有成员[转载]
    如果在BackgroundWorker运行过程中关闭窗体…
    交叉编译的概念
    索引器的重载的一个例子
    自定义类实现IComparable接口
    ioctl函数
  • 原文地址:https://www.cnblogs.com/zoo-x/p/14803785.html
Copyright © 2011-2022 走看看