当前位置: 首页 > 图文教程 > 网络编程 > Javascript > js 函数的执行环境和作用域链的深入解析

Javascript
[原创]js 日期加红代码 适用于各种cms
[原创]javascript 改变字体大小方法集合
jsTree树控件(基于jQuery, 超强悍)[推荐]
修改jQuery.Autocomplete插件 支持中文输入法 避免TAB、ENTER键失效、导致表单提交
jQuery live( type, fn ) 委派事件实现
javascript createElement()创建input不能设置name属性的解决方法
Jquery 表单取值赋值的一些基本操作
jquery select选中的一个小问题
网页里控制图片大小的相关代码
网页常用特效代码整理
网站上面有这种切换效果
tagName的使用,留一笔
图片按比例缩放函数
非常好的js代码
精彩图片推荐 渐隐渐现
左右图片循环滚动停顿一下后继续
popdiv
奇妙的Javascript图片放大镜
怎么用javascript进行拖拽
一个表格收缩展开的函数

Javascript 中的 js 函数的执行环境和作用域链的深入解析


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2010-01-10   浏览: 144 ::
收藏到网摘: n/a

在js中对象的外在表现形式为函数。 第一步. 定义后:每个已定义函数,都有一个内在属性[scope],其对应一个对象的列表,列表中的对象仅能内部访问。
例如:建立一个全局函数A,那么A的[Scope]内部属性中只包含一个全局对象(Global Object),而如果我们在A中创建一个新的函数B,那么B的[Scope]属性中就包含两个对象,函数A的Activation Object对象在前面,全局对象(Global Object)排在后面。
简而言之,一个函数的[Scope]属性中对象列表的顺序是上一层函数的Activation Object对象,然后是上上层的,一直到最外层的全局对象。

第二步.执行时:当一个函数被执行的时候,会自动创建一个可以执行的对象(Execution Object),并同时绑定一个作用域链(Scope Chain)。作用域链会通过下面两个步骤来建立,用于进行标识符解析。
首先,将函数对象[Scope]内部属性中的对象,按顺序复制到作用域链Scope Chain中。
其次,在函数执行时,会创建一个新的Activation Object对象,这个对象中包含了this、参数(arguments)、局部变量(包括命名的参数)的定义,这个Activation Object对象会被置于作用域链的最前面。
所以在Scope Chain中最后顺序是本函数的Activation Object,然后是上层函数的Activation Object,再上上层的Activation Object,一直到Global Object。

当执行js代码的过程中,遇到一个标识符,就会根据标识符的名称,在执行上下文(Execution Context)的作用域链中进行搜索。从作用域链的第一个对象(该函数的Activation Object对象)开始,如果没有找到,就搜索作用域链中的下一个对象,如此往复,直到找到了标识符的定义。如果在搜索完作用域中的最后一个对象,也就是全局对象(Global Object)以后也没有找到,则会抛出一个错误,提示undefined。

由此而来的建议:
1. 尽量使用局部变量,这不仅仅是涉及到私有属性的问题,局部的变量从以上过程中可以看到,能够减少搜索的时间(注:在一般的情况下,不包括浏览器的优化行为)。
2. 避免使用with语句。因为它会修改执行上下文(Execution Context)的作用域链,在最前面添加一个对象(Variable Object)。同理,对于try-catch语句中的catch语句块也类似。