黑马程序员技术交流社区

标题: 【上海校区】JavaScript函数作用域精解 [打印本页]

作者: 不二晨    时间: 2019-3-29 16:40
标题: 【上海校区】JavaScript函数作用域精解
一、作用域有关定义

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
版权声明:本文为博主原创文章,转载请附上博文链接!


作者: 不二晨    时间: 2019-4-10 14:31
奈斯,感谢分享!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2