函数作用域以及作用域链
2017-11-11 本文已影响119人
胡哥有话说
变量作用域
在JS中区分函数作用域时主要区分为函数内部定义变量(局部变量)和函数外部定义变量(全局变量)
-
局部变量
在函数内部使用var关键字定义的变量称之为 局部变量 -
全局变量
在函数外部使用var关键字定义的变量称之为 全局变量
// 此处 a 为全局变量
var a = 10;
// 定义函数
function memeda () {
// 此处 a 为局部变量
var a = 20;
}
特点:
局部变量是无法直接影响全局变量的
局部变量影响全局变量的方法
- 在函数内部不使用var关键字,直接操作全局变量
- 将函数内部的局部变量使用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才有值