JS函数作用域

function f(){}

函数也属于对象,叫做函数对象,是对象就有属性,比如f.name;f.age,还有一些我们用不了的属性,仅供javascript引擎使用,[[scope]]就是其中一个,[[scope]]就是我们所说的作用域,里面存储了运行其上下文的集合

[[scope]]随着函数产生而产生

[[scope]]中存着运行其上下文的对象的集合,这个集合呈链式链接,我们把这种链式链接叫做作用域链

运行其上下文:当函数运行时,会创建一个称为执行其上下文的内部对象。一个执行其上下文定义了一个函数执行时的环境,函数每次执行时对应的执行上下文都是独一无二的,所以多次调用一个函数会生成多个执行其上下文,当函数执行完毕,它所产生的上下文被销毁。

JS函数作用域

JS函数作用域

函数a被定义时,存的是GO,准确点说是所在其环境的上下文

JS函数作用域

a函数执行时,产生一个AO,放在最顶端,同时也会定义b函数

JS函数作用域

b函数是在a函数里面,所以捡a的现成的作用域。因为b是在a里面定义的,b所在的环境是a给的。b能访问a的作用域和全局作用域,而a不能访问b的作用域

JS函数作用域

当b执行完后,它的执行上下文被销毁,也就是说它自己的AO被销毁,scope chain 里的0不再指向AO,回归到被定义时的状态,等待下次调用。

在这个函数中,b执行完后,a也执行完了,a的执行上下文也被销毁,它的scope chain里面的0也不再指向自己的AO,b函数彻底没了,a回归到被定义时的状态,等待下次调用