美文网首页程序员
js基础6(作用域、js解析顺序)

js基础6(作用域、js解析顺序)

作者: 逆_3ec2 | 来源:发表于2018-08-27 18:24 被阅读0次

    1、作用域

    作用域用于就是变量访问性问题

    1. 全局作用域
      • 在script其实标签到结束标签都是在全局作用域里,在函数体之外,script标签内声明的变量就是全局变量
      • 全局作用域的变量可以在任何其他的作用域访问和修改
    2. 局部作用域
      • 一个函数体就是一个新的局部作用域
      • 函数内部定义的变量在局部作用域内,函数外部作用域不能访问内部作用域的变量
      • 每个函数有不同的作用域,在其他函数中不可以访问(一个函数访问另一个函数的变量,通过传递参数实现)
      • var声明的变量提升:在函数作用域或者全局作用域中通过var声明的变量,不管在哪里声明,都会被当成在当前作用域的顶部声明变量,这个称之为变量提升
    3. 块作用域

    let,const不仅仅是声明变量的区别,他们还有支持块作用域的机制,自身会产生一个块作用域(注:这里说的不是大括号、if、switch、for产生的块)

    1. 作用域链
      • 函数作用域里面访问一个变量,先从自身开始找,如果没有,就依次往上一级作用域查找, 直到全局作用域,还是没有就报错
      • 当我们处于某一个作用域里,修改某个变量值时,先修改自身作用域的值,如果没有就依次修改上一个作用域的值
      • delete:删除未声明的变量,但是不能删除已经声明的变量
      let x = 1;
      function fun (){
        let y = 1;
      }
    
    //块作用域
    if (true){
      var name = "banta";
      let color = "red";
      const x = 1;
    }
    console.log(name);
    console.log(color ); //会报错
    console.log(x);
    

    2、js解析顺序

    1. 编译(判断语法是否符合规范)
      先去查找第一个作用域里面所有var,function的声明,但不赋值(var,function声明同一个变量时,函数会覆盖var)
    2. 执行期
      运行js代码,执行期里面有新的作用域,就会被激活,重新开始编译-执行,依次类推
    console.log(a);
    fun();
    var a = 10;
    function fun (){
      console.log(a);
    }
    console.log(a); // undefined undefined 10
    /*
      1、编译:
        var a;
        function fun (){};
      2、执行期
        30行 --- undefined 声明变量没有赋值
        31行 --- 函数自执行,产生新的作用域
          1、编译
          2、执行
            34行 --- undefined 找到全局作用域a,声明未赋值
            返回上一个作用域继续执行
          32行 --- a = 10 赋值
          36行 --- 10 
    */
    

    相关文章

      网友评论

        本文标题:js基础6(作用域、js解析顺序)

        本文链接:https://www.haomeiwen.com/subject/pxkmpftx.html