美文网首页H5前端技术分享
函数作用域以及作用域链

函数作用域以及作用域链

作者: 胡哥有话说 | 来源:发表于2017-11-11 20:53 被阅读119次

    变量作用域

    在JS中区分函数作用域时主要区分为函数内部定义变量(局部变量)和函数外部定义变量(全局变量)

    1. 局部变量
      在函数内部使用var关键字定义的变量称之为 局部变量

    2. 全局变量
      在函数外部使用var关键字定义的变量称之为 全局变量

    // 此处 a 为全局变量
    var a = 10;
    
    // 定义函数
    function memeda () {
        // 此处 a 为局部变量
        var a = 20;
    }
    

    特点:

    局部变量是无法直接影响全局变量的

    局部变量影响全局变量的方法

    1. 在函数内部不使用var关键字,直接操作全局变量
    2. 将函数内部的局部变量使用return关键字返回到函数外部,使用对应的变量进行接收

    作用域链

    函数内部的变量在进行查找时会先从自身内部的作用域进行查找,如果不存在则依次向父级、先辈作用域进行查询,一直到最顶层的window对象

    1、看代码说话

    // 定义如下代码
    var a = 10;
    
    function memeda () {
        var a = 20;
    
        // 定义函数
        funtion test () {
            console.log(a);
        }
    
        // 调用函数
        test()
    }
    
    // 调用函数memeda,此时控制台会输出什么?
    memeda();        // 20
    

    解析

    1. 调用函数memeda(),则执行函数内部的表达式
    2. 函数内部声明变量a和函数test
    3. 调用函数test(),输出变量a
    4. 在test函数内部无变量a,按照变量作用域查找原则,向父级作用域是否有变量a
    5. 父级作用域中包含了变量a,输出该变量的值
    

    2、看代码说话

    var a = 10;
    function memeda () {
        var a = 20;
    
        // 定义函数
        function test () {
            console.log(a);        // ? 此处输出什么
    
            var a = 30;
        }
    
        // 调用函数
        test()
    }
    
    // 调用函数
    memeda()
    

    解析

    1. 在该例中,test()函数内部声明了变量 var a = 30; var 关键字var声明的变量优先被执行,进行声明
    2. 此时在函数test内部先声明了变量a,初始值为undefined,在console.log(a) 输出undefined
    3. 当程序执行到var a = 30;此处的代码时,给变量a进行赋值操作,此时a才有值
    

    相关文章

      网友评论

      本文标题:函数作用域以及作用域链

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