H5前端技术分享

函数作用域以及作用域链

2017-11-11  本文已影响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才有值
上一篇下一篇

猜你喜欢

热点阅读