关于JavaScript的执行域,标识符解析,闭包的研究
2010-09-14 13:22:07 来源:WEB开发网在js中,作用域的概念和其他语言差不多, 在每次调用一个函数的时候 ,就会进入一个函数内的作用域,当从函数返回以后,就返回调用前的作用域,但js的实现方式却和一般语言不同,并非用“堆栈”方式,而是使用列表,具体过程如下(ECMA262中所述):
在一个函数对象被创建的时候, 会创建一个活动对象(也就是一个对象),然后对于每一个函数的形参,都命名为该活动对象的命名属性:
view plaincopy to clipboardprint?
var func = function(lps, rps){
........
}<PRE></PRE>
var func = function(lps, rps){
........
}
对于上面的列子,会创建一个活动对象(假设为aObj),给这个对象添加俩个命名属性aObj.lps, aObj.rps; 然后还会创建一个arguments对象,这个对象以数组的方式保存调用参数,还有callee等其他参数;然后将arguments也作为活动对象(假设为aObj)的一个同名命名属性(arguments);还有就是,对于每一个这个函数申明,或者定义的变量,都作为该活动对象的同名命名属性。内部函数也是一样。
在真正的调用时刻,会做一个叫做变量实例化的过程,也就是将调用参数赋值给形参数,对于缺少的调用参数,赋值为undefined。
接下来,谈谈作用域, 在js中,作用域的实现,是通过一个列表[[scope]]。对于每一个js的函数对象,都维护一个内部的对象列表[[scope]],这个列表由上面提到的一个个活动对象组成。
当调用一个函数的时候,这个函数的活动对象列表,将保存该函数作用域(调用者的作用域)列表,然后将对于这个被调用函数所生成的活动对象,置于[[scope]]的最前端。
Tags:关于 JavaScript 执行
编辑录入:爽爽 [复制链接] [打 印]更多精彩
赞助商链接