JavaScript | 作用域和预解析

814 阅读3分钟

目标

  • 能够说出JavaScript的两种作用域
  • 能够区分全局变量和局部变量
  • 能够说出如何在作用域链中查找变量的值

目录

  • 作用域
  • 变量的作用域
  • 作用域链

1. 作用域

1.1 作用域概述

通常来说,一段程序代码中所用到的名字并不总是有效和可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域。作用域的使用提高护程序逻辑的局部性,增强了程序的可靠性,减少了名字冲突。

es5

  • 全局作用域:整个script标签或者是一个单独的js文作

  • 局部作用域(函数作用域)在函数内部就是局部作用域这个代码的名字只在函数内部起效果和作用

2. 变量的作用域

2.1 变量作用域的分类

在JavaScript中,根据作用域的不同,变量可以分为两种:

  • 全局变量
  • 局部变量

注意如果在函数内部没有声明直接赋值的变量也属于全局变量

注意:函数的形参也可以看做是局部变量

从执行效率来看全局变量和局部变量

  • 全局变量只有浏览器关闭的时候才会销毁,比较占内存资源
  • 局部变量当我们程序执行完毕就会销毁,比较节约内存资源

3. 作用域链

  • 只要是代码,就至少有一个作用域
  • 写在函数内部的局部作用域
  • 如果函数中还有函数,那么在这个作用域中就又可以诞生一个作用域
  • 根据在内部函数可以访问外部函数变量的这种机制,用链式查找决定哪些数据能被内部函数访问,就称作作用域链

目标

  • 能够知道解析器运行JS分为哪两步
  • 能够说出变量提升的步骤和运行过程
  • 能够说出函数提升的步骤和运行过程

目录

  • 预解析
  • 变量预解析和函数预解析
  • 预解析案例

1. 预解析

JavaScript代码是由浏览器中的JavaScript解析器来执行的。JavaScript解析器在运行JavaScript代码的时候分为两步:预解析和代码执行。

  • 预解析:js引擎会把js里面所有的 var还有function提升到当前作用域的最前面
  • 代码执行:按照代码书写的顺序从上往下执行

预解析分为变量预解析(变量提升)和函数预解析(函数提升)

  • 变量提升:就是把所有的变量声明提升到当前的作用域最前面不提升赋值操作
  • 函数提升:就是把所有的函数声明提升到当前作用域的最前面不调用函数

2. 案例

2.1 结果是啥

        var num =10 ;
        fun();
        function fun () {
            console.log (num);
            var num = 20;
        }
        //相当于执行
        var num ;
        function fun () {
            var num ;
            console.log(num); {
                num = 20 ;

            }
        }
        num = 10 ;
        fun() ;

2.2 结果是啥

       f1();
        console.log(c);
        console.log(b);
        console.log(a);

        function f1(){
            var a = b = c = 9 ;
            console.log(a);
            console.log(b);
            console.log(c);
        }

        // 预解析
        function f1(){
            var a = b = c = 9 ;
            //相当于var a= 9; b= 9; C= 9;
            //集体声明var a= 9, b = 9, c = 9;

            console.log(a);
            console.log(b);
            console.log(c);
        }
        f1();
        console.log(c);
        console.log(b);
        console.log(a);

把你认为的正确答案评论在下面吧~ 嘿嘿