要了解作用域链,首先呢,先了解一下,什么是作用域。
作用域
作用域,顾名思义就是起作用的区域。先看一个例子吧:
var a = 1
function fn1(){
function fn2(){
console.log(a)
}
function fn3(){
var a = 4
fn2()
}
var a = 2
return fn3
}
var fn = fn1()
fn()
在这个例子中一共有3层,从里往外看吧,最外层叫做全局变量,往里面看,function fn1()里面包裹着fn2和fn3,这是个局部变量,而里面呢,fn2和fn3也是一个局部变量,只是针对的对象不同,这是它的一个结构。
全局变量:最外层函数定义的变量拥有全局作用域,即对任何内部函数来说,都是可以访问的。
局部变量:和全局作用域相反,局部作用域一般只在固定的代码片段内可访问到,而对于函数外部是无法访问的。
看到这里大家应该对于作用域有了一定的了解了。
那上面这个代码,控制台输出为a的值,那a的值为什么呢?带着这个问题,咱们继续了解一下作用域链。
作用域链
作用域链:js的执行顺序是根据函数的调用来决定的,当一个函数被调用时,该函数环境的变量对象就被压入一个环境栈中。而在函数执行之后,栈将该函数的变量对象弹出,把控制权交给之前的执行环境变量对象。
看上一个例子吧,控制台输出a的值,但在fn2中并没有定义a的值,那么就往包裹着fn2的区域找,也就是fn1,定义变量a为2,所以就输出2。如果fn1中也没有定义a的值,那就在往外一层找,直到找到全局变量。
规则
- 函数在执行过程中,先从自己内部找变量。
*如果找不到,再从创建当前函数所在的作用域去找,以此往上。
*注意找的是变量的当前状态。
网友评论