js高端系列教程(23)执行上下文其二:作用域链ScopeChains

js高端系列教程(23)执行上下文其二:作用域链ScopeChains

ID:43091502

大小:63.19 KB

页数:4页

时间:2019-09-26

js高端系列教程(23)执行上下文其二:作用域链ScopeChains_第1页
js高端系列教程(23)执行上下文其二:作用域链ScopeChains_第2页
js高端系列教程(23)执行上下文其二:作用域链ScopeChains_第3页
js高端系列教程(23)执行上下文其二:作用域链ScopeChains_第4页
资源描述:

《js高端系列教程(23)执行上下文其二:作用域链ScopeChains》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、作用域链(ScopeChains)Ascopechainisalistofobjectsthataresearchedforidentifiersappearinthecodeofthecontext.作用域链是一个对象列表(listofobjects),用以检索上下文代码中出现的标识符(identifiers)。作用域链的原理和原型链很类似,如果这个变量在自己的作用域中没有,那么它会寻找父级的,直到最顶层。标示符[Identifiers]可以理解为变量名称、函数声明和普通参数。例如,当一个函数在自身函数体内需要引用一个变量,但是这个变量并没

2、有在函数内部声明(或者也不是某个参数名),那么这个变量就可以称为自由变量[freevariable]o那么我们搜寻这些自由变量就需要用到作用域链。在一般情况下,一个作用域链包括父级变量对象(variableobject)(作用域链的顶部)、函数自身变量VO和活动对象(activationobject)。不过,有些情况下也会包含其它的对象,例如在执行期间,动态加入作用域链中的一例如with或者catch语句。[译注:with-objects指的是with语句,产生的临时作用域对象;catch-clauses指的是catch从句,如catch(e

3、),这会产生异常对象,导致作用域变更]。当查找标识符的时候,会从作用域链的活动对象部分开始查找,然后(如果标识符没有在活动对象中找到)查找作用域链的顶部,循环往复,就像作用域链那样。varx=10;(functionfoo(){vary二20;(functionbar(){varz=30;//〃x〃和〃y〃是自由变量//会在作用域链的下一个对象中找到(函数”bar"的互动对象之后)console.log(x+y+z);})();})();我们假设作用域链的对象联动是通过一个叫做—_parent_—的屈性,它是指向作用域链的下一个对象。这可以在

4、RhinoCode中测试一下这种流程,这种技术也确实在ES5环境中实现了(有一个称为outer链接).当然也可以用一个简单的数据来模拟这个模型。使用—_parent__的概念,我们可以把上面的代码演示成如下的情况。(因此,父级变量是被存在函数的[[Scope]]属性中的)。barcontextscopechainbarAOz30_parent__parent_null作用域链在代码执行过程中,如果使用with或者catch

5、语句就会改变作用域链。而这些对象都是一些简单对象,他们也会有原型链。这样的话,作用域链会从两个维度来搜寻。1.首先在原本的作用域链2.每一个链接点的作用域的链(如果这个链接点是有prototype的话)我们再看下面这个例子:Object.prototype・x=10;varw二20;vary二30;//在SpidcrMonkcy全局对彖里//例如,全局上下文的变量对象是从"Object,prototype"继承到的//所以我们可以得到“没有声明的全局变量”//因为可以从原型链中获取console,log(x);//10(functionfoo

6、(){//〃foo〃是局部变量varw=40;varx二100;//"x"可以从"Object,prototype"得到,注意值是10哦//因为{z:50}是从它那里继承的with({z:50}){console.log(w,x,y,z);//40,10,30,50}//在〃with〃对象从作用域链删除之后//X又可以从foo的上下文中得到了,注意这次值又回到了100哦//气彳也是局部变量console.log(x,w);//100,40//在浏览器里//我们可以通过如下语句来得到全局的值console.log(window.w);//20}

7、)();之前,我们就会有如下结构图示。这表示,在我们去搜寻__parent首先会去__proto__的链接中。fooAOw40X100_parent_―IObject.prototypex10_proto_nullfoocontextscopechainwithobjectz50_proto_■—_parent_—I—foo.[[Scope]]GlobalVOw20V30_roto_•“_parent_nullwith增大的作用域链注意,不是所有的全局对象都是由Object.protot

8、ype继承而来的。上述图示的情况可以在SpiderMonkey中测试。只要所有外部函数的变量对象都存在,那么从内部函数引用外部数据则没有特别Z处一一我们只要遍历作用

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。