JavaScript(作用域精简)

js运行3步曲?
1.语法分析
2.预编译
3.解释执行
当Js代码执行一个函数,会创建对应的执行期上下文的内部对象(Active Object) ,该函数每执行一 次,都会创建单独的执行期上下文。并且每个执 下文是独一无二的。当函数执行完毕,执行上下文被销毁。

作用域链:

每个javascript函数都是一 个对象,对象中有些属性我们可以访问,但有些不可以,这些属性仅供javascript引l擎存取,[[scope]]就是其中一个。[[scope]]指的就是我们所说的作用域,其中存储了执行期上下文的集合。这个集合被称为函数的作用域链(scopechain) ,包含函数定义时作用域中,可访问的数据。
查找变量:函数在执行时,查找变量从作用域链的顶端依次向下查找。

代码:
image.png

如上截图:当函数a定义时,它的作用域链就创建了。函数所在的全局的GO对象,被放在作用域链的第一 个位置。GO对象中保存了this ,window , document以及全厂象中的a函数;
a被定义时,创建a的执行上下文内部对象,发生如下过程:


image.png

当我们调用a时,并放在作用域链的最顶端。
image.png

接下来,b函数被执行时,创建一个b函数AO对象:并将这个激活对象推送到执行其上下文作用域链的顶部。(下图)
image.png

在a()的执行时, b函数的被创建,所以,a被执行时所产生的a的Activatio Object (激活对象)和b被创建的a的Activation Object (激活对象)是同一个

接下来,b函数被执行时,创建一个b函数AO对象:并将这个激活对象推送到执行其上下文作用域链的顶部。


image.png

函数每执行一次,都会创建单独的执行期上下文的内部对象(Activation Object (激活对象) )。 并且每个执行上下文是独一无二_的。当函数执行完毕,执行上下文被销毁。那么当b执行完,a也执行完了。所产生的执行上下文被销毁。a又恢复到被定义状态

闭包

看如下函数:


image.png

在a执行完后,a会销毁自己的AO, GO对象(销毁的是对AO,GO对象的引用),但b定义时,b没有被执行,b的AO,GO被保存在外面。(闭包)
上面代码的图解:


image.png

闭包:
闭包是内部函数被保存到外面,导致作用域链不释放。所以闭包会导致内存泄露

你可能感兴趣的:(JavaScript(作用域精简))