一、作用域有关定义
1.作用域
每个JavaScript函数都是一个对象,对象中有些属性我们可以访问,有些不可以。不可以访问的属性仅供javascript引擎使用,[[scope]]就是其中一个。[[scope]]就是我们所说的作用域,其中存储了运行期上下文的集合
2.作用域链
[[scope]]中所存储执行期上下文对象的集合,这个集合呈链式链接,我们把这种链式链接叫做作用域链。
3.执行期上下文
当一个函数在执行时,会创建一个执行期上下文对象。一个执行期上下文定义了一个函数执行的环境,函数每次执行对应的执行期上下文是独一无二的,所以多次调用一个函数会导致创建多个执行期上下文。当函数执行完毕时,所产生的执行上下文被销毁。
4.查找变量
从作用域链的顶端向下依次查找
二、作用域有关实例
function func() {
var num = 1;
alert(num);
}
func();
1.在函数func定义时
(1)func函数在定义时便有了属性[[scope]],这一属性就会包含函数被创建的作用域中对象的集合。这个集合呈链式链接,被称为函数的作用域链 。
(2)func的作用域链中填入一个全局对象(Global Object),该全局对象包含了所有全局变量,如下图所示(注意:图片只例举了全部变量中的一部分):
2.在函数func执行时
(1)在函数执行时,会创建一个叫做执行环境/执行期上下文(execution context)的内部对象 ,它定义了一个函数执行时的环境。函数每次执行时的执行环境独一无二 。多次调用函数就多次创建执行环境 ,函数执行完毕后,执行环境就会被销毁。 执行环境有自己的作用域链,用于解析标识符。
[[Scope]]和执行期上下文虽然保存的都是作用域链,但不是同一个东西 。[[Scope]]属性是函数创建时产生的,会一直存在,而执行上下文在函数执行时产生,函数执行结束便会销毁。
(2)执行期上下文取得func函数内部[[Scope]]属性保存的作用域链(复制),然后func函数产生了一个活动对象AO(Active Object),这个对象被推入执行期上下文作用域链的最前端。该对象包含了函数的所有局部变量、命名参数、参数集合以及this,当函数执行完毕时,运行期上下文被销毁,活动对象也随之销毁。执行期上下文的作用域链如下图所示:
三、作用域有关疑问
function a(){
function b(){
aa=234;
}
var aa=123;
b();
console.log(aa);
}
var glob=100;
a();
1.b函数的a函数ao对象和a函数ao对象是不是同一个?
答案:console.log(aa)输出的是234,b函数执行时产生作用域链保存的有b函数的ao、a函数执行时ao对象的地址和a函数执行时go对象的地址等。在b函数ao对象中找不到aa元素,向下寻找,找到a函数ao对象中的aa元素并赋值。所以说,b函数的ao对象和a函数ao对象不是同一个,b中的a函数ao对象是个地址。
2.a函数定义时的作用域链和a函数执行时的执行期上下文的作用域链是不是同一个?
答案:不是。
3.执行期上下文在什么时候销毁?
答案:[[Scope]]属性是函数创建时产生的,会一直存在,而执行上下文在函数执行时产生,函数执行结束便会销毁。
---------------------
【转载,仅作分享,侵删】
作者:Ryan Ji
来源:CSDN
原文:https://blog.csdn.net/qq_42451979/article/details/81127058
版权声明:本文为博主原创文章,转载请附上博文链接!
|
|