JavaScript 函数的执行过程
2016-05-08 23:43
357 查看
每一个JavaScript函数都是Function对象的一个实例, 它有一个仅供JavaScript引擎存取的内部属性[[Scope]]. 这个[[Scope]]存储着一个作用域的集合, 这个集合就叫”作用域链”, 集合中存储着”可变对象”VO或”活动对象”AO(AO比VO多this和arguments属性).
当函数被创建后, 其父级作用域的作用域链中的所有可变对象会被加入到它的[[scope]]中(如果父作用域是全局, 那么当前函数的作用域链中就只会加入一个全局对象).
当函数被执行时, 函数的执行环境会被推入一个环境栈中:
此时进入函数的变量初始化阶段, 此阶段会确定函数内部: this值, 函数的参数, 函数的声明, 变量的声明, 以及arguments. 根据这些值组成当前函数的活动对象AO, 之后会将AO对象保存到当前函数作用域链的首位.
注意: AO按如下顺序填充:
函数参数(若有传参, 会被赋值, 若未传参, 初始化值为undefined) 优先级第二
函数声明(若发生命名冲突, 会覆盖) 优先级最高
变量声明(初始化变量值为undefined, 若发生命名冲突, 会忽略) 优先级第三
然后就到了函数的执行阶段, 此阶段当前函数中使用到的所有变量和函数声明都会从当前函数的[[Scope]]作用域链中查找, 根据作用域链中对象的位置首先会查找当前函数的AO对象, 如果没有再查找上层对象, 最后找到全局对象, 如果都没有则会报错(变量未定义).
第一次写微博, 有不对或遗漏的地方还请指正.
参考<<高性能JavaScript>>
当函数被创建后, 其父级作用域的作用域链中的所有可变对象会被加入到它的[[scope]]中(如果父作用域是全局, 那么当前函数的作用域链中就只会加入一个全局对象).
当函数被执行时, 函数的执行环境会被推入一个环境栈中:
此时进入函数的变量初始化阶段, 此阶段会确定函数内部: this值, 函数的参数, 函数的声明, 变量的声明, 以及arguments. 根据这些值组成当前函数的活动对象AO, 之后会将AO对象保存到当前函数作用域链的首位.
注意: AO按如下顺序填充:
函数参数(若有传参, 会被赋值, 若未传参, 初始化值为undefined) 优先级第二
函数声明(若发生命名冲突, 会覆盖) 优先级最高
变量声明(初始化变量值为undefined, 若发生命名冲突, 会忽略) 优先级第三
然后就到了函数的执行阶段, 此阶段当前函数中使用到的所有变量和函数声明都会从当前函数的[[Scope]]作用域链中查找, 根据作用域链中对象的位置首先会查找当前函数的AO对象, 如果没有再查找上层对象, 最后找到全局对象, 如果都没有则会报错(变量未定义).
第一次写微博, 有不对或遗漏的地方还请指正.
参考<<高性能JavaScript>>
相关文章推荐
- JS学习10(DOM扩展)
- js实现跨域(jsonp, iframe+window.name, iframe+window.domain, iframe+window.postMessage)
- test extjs
- Give some advice on how to learn html,css,and javascript for c developers
- jsp页面使用表达式<%=basePath%>跳转报“ attribute for %> is not properly terminated”错误
- Openlayers 2 js文件的合并
- 第28篇 js中let和var
- js复习重点
- THREE.JS中常用的4种光源
- 最短路Floyd(hdu1874),dijstra(poj2387)
- 在jsp中引入js文件不成功的原因
- js实现三级菜单的制作
- advanced JavaScript Skills ——Require.js(二)
- js判断IE6及以下版本浏览器
- JSP-JSP的生命周期
- javascript模块化开发编程
- Javascript异步编程的4种方法
- javaScript this 详解
- JavaScript正则表达式
- poj 2387 Til the Cows Come Home -- 最短路dijstra