zoukankan      html  css  js  c++  java
  • 为什么全局变量在赋值之前调用会报错

    为什么全局变量在赋值之前调用会报错

    参考文献 https://www.cnblogs.com/highshao/p/5442460.html
    声明:本文且是作者写给自己看的不公开,如若你看到了,文章里可能会有一些内容会误导你(因为作者还是个小菜鸟)

    一、在声明局部变量前,调用局部变量返回undefind

    function f() {
      alert(a);
      var a = 3;
    }
    f(); //undefind
    

    二、在全局变量赋值前,调用全局变量会报error: a is not defined

    function f() {
      alert(a);
      a = 3;
    }
    
    f(); //error: a is not defined
    

    思考:上面两个例子都是在没有赋值之前就调用了变量,为什么局部变量可以通过编译,而全局变量会报错呢?

    答:在预编译期,解析器会对所有var 和 fuction 进行声明,因为全局变量没有var,不能声明所以会报错。

    注意:JS的解析过程分为两个阶段:预编译期(预处理)与执行期。

    预编译期 :JS会对本代码块中的所有var声明的变量和function 声明的函数进行处理,但需要注意的是此时处理函数的只是声明式函数,而且变量也只是进行了声明但未进行初始化以及赋值。

    执行期 :会按照代码块的顺序逐行执行。。

    思考题1:

    函数内全局赋值一次,var声明一次 函数f()内还是会优先使用自己的变量a

    var a = 1;                 
    function f(){
        alert(a);               
        a = 2;                
        alert(a);           
        var a = 3;                       
        alert(a);
    }
    
    f();            //undefined 2 和 3
    alert(a);       //1
    
    

    经典问题 思考题2:

    var a, b;
    (function() {
      alert(a); //undefined
      alert(b); //undefined  
      var a = b = 3; //等价于 var a = 3 ; b = 3; b是全局的
      alert(a); //3
      alert(b); //3
    })();
    alert(a); //undefined
    alert(b); //3
    
  • 相关阅读:
    8.16
    8.6 总结
    Educational Codeforces Round 45 (Rated for Div. 2)
    Codeforces Round #487 (Div. 2)
    Codeforces Round #485
    codeforces Avito Code Challenge 2018
    MySQL索引知识面试题
    使用多线程优化复杂逻辑以及数据量多处理
    elasticsearch 和Ik 以及 logstash 同步数据库数据
    linux 安装elasticsearch步骤以及入的坑
  • 原文地址:https://www.cnblogs.com/hyx626/p/9291995.html
Copyright © 2011-2022 走看看