作用域
JavaScript作用域是靠函数来形成的,也就是一个函数内定义的变量函数外不可以访问
不使用var会声明一个全局变量
作用域链
当代码在一个环境中执行时,会创建变量对象的一个作用域链。
作用域链的用途:是保证对执行环境有权访问的所有变量和函数的有序访问。
作用域第一个对象始终是当前执行代码所在环境的变量对象,全局环境的变量对象是作用域链中的组后一个对象。
- 函数在执行的过程中,先从自己内部找变量
- 如果找不到,再从创建当前函数所在的作用域去找,以此往上
- 注意找的是变量的当前状态
示例
var color = "blue";
function changeColor(){
var anotherColor = "red";
function swapColors(){
var tempColor = anotherColor;
anotherColor = color;
color = tempColor;
// 这里可以访问color、anotherColor、tempColor
}
// 这里可以访问color、anotherColor,但不能访问tempColor
swapColors();
}
// 这里只能访问color
changeColor();
作用域链图
作用域链.jpg
示例
var a = 1
function fn1(){
function fn3(){
function fn2(){
console.log(a)
}
fn2()
var a = 4
}
var a = 2
return fn3
}
var fn = fn1()
fn() //输出多少
//输出 undefined
解析: 在本例中先执行var a = 1,var fn = fn1(),进入function fn1(),执行return fn3,进入function fn3(),由于变量声明前置,先执行var a,在执行fn2(),进入function fn2(),执行console.log(a),在该作用域内没有a,前往上一级作用域寻找a,找到 var a,未赋值,所以结果为undefined。