5<保姆教程>》JavaScript基础(作用域,作用域链,预解析)

95 阅读2分钟

JavaScript基础

作用域

  1. 是什么,作用与分类
    /*  
    js作用域:就是变量在某个范围内起作用/有效,目的是为了提高代码的可靠性,更重要的是减少命名冲突
    作用域分类:es6之前,只分为全局作用域和局部作用域
     */
  1. 全局作用域与局部作用域
    /* 
    1. 全局作用域:整个script标签或者一个单独的js文件 
        //---- 全局作用域
    2. 局部作用域:函数内部就是局部作用域
    function f1() {
       //----局部作用域
    }
     */
  1. 全局变量与局部变量
    // 变量作用域:根据作用域的不同,我们变量分为全局变量和局部变量
    - 全局变量:在全局作用域下声明的变量,在全局都可以使用
     var num = 1
    console.log(num)

    function f1() {
        console.log(num)
    }
    console.log(num)
    // 这种情况下num是全局作用域
     function f1() {
        num1 = 1
        console.log(num1)
    }
    f1()
    console.log(num1)
    // 在函数内部不使用var声明直接赋值的变量,在函数调用之后就会变成全局变量(不推荐使用)
    - 局部变量:在函数内部可以使用
     function f2(){
        let num2=1
        console.log(num2)
    }
    // num2只能在f2函数内部才能使用,是局部变量
    /* 
    从执行效率来看:
    1. 全局变量只有浏览器关闭的时候才会销毁,比较占内存资源
    2. 局部变量 当我们程序执行完毕就会销毁,比较节约内存资源
     */

作用域链

    //作用域链:内部函数访问外部函数的变量,采用的是链式查找的方式来决定取那个值,这种结构我们称作作用域链
     function f1() {
        var a = 1

        function f2() {

            console.log(a)//此处首先在f2{}里面查找变量a,找不到在往其外部函数f1{}里面找变量a
        }
        f2()
    }
    f1() 

预解析

/* 
    1. js引擎运行js分为两步:预解析和代码执行
        (1)预解析:js引擎会把js里面所有的var还有function提升到当前作用域的最前面
        (2)代码执行:按照代码的书写顺序从上到下执行

    2. 预解析分为变量预解析(变量提升)和函数预解析(函数提升)
        (1)变量提升:就是把所以的变量声明提升到当前作用域最前面,只提升不赋值
        (2)函数提升:就是把所以的函数声明提升到当前作用域的最前面,不调用函数
     */
    //案例1
    console.log(a) //undefined
    var a = 10
    console.log(a) //10
    // 相当于
    var a;
    console.log(a)
    a = 10
    console.log(a) 
    // 案例2
    f1()

    function f1() {
        console.log(1)
    }
    // 相当于
    function f1() {
        console.log(1)
    }
    f1()