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


Posted in Javascript onNovember 01, 2009

第一步. 定义后:每个已定义函数,都有一个内在属性[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语句块也类似。

Javascript 相关文章推荐
jquery 1.4.2发布!主要是性能与API
Feb 25 Javascript
jQuery表单验证插件formValidator(改进版)
Feb 03 Javascript
JavaScript中实现异步编程模式的4种方法
Sep 24 Javascript
jQuery实现文件上传进度条特效
Aug 12 Javascript
js实现带缓冲效果的仿QQ面板折叠菜单代码
Sep 06 Javascript
很全面的JavaScript常用功能汇总集合
Jan 22 Javascript
JavaScript中的跨浏览器事件操作的基本方法整理
May 20 Javascript
js将当前时间格式化为 年-月-日 时:分:秒的实现代码
Jan 20 Javascript
弱类型语言javascript开发中的一些坑实例小结【变量、函数、数组、对象、作用域等】
Aug 07 Javascript
js实现翻牌小游戏
Jul 31 Javascript
JavaScript中arguments的使用方法详解
Dec 20 Javascript
前端学习——JavaScript原生实现购物车案例
Mar 31 Javascript
提高网站性能之 如何对待JavaScript
Oct 31 #Javascript
JavaScript Sort 表格排序
Oct 31 #Javascript
DOM 脚本编程中的兄弟节点
Oct 31 #Javascript
javascript GUID生成器实现代码
Oct 31 #Javascript
json 实例详细说明教程
Oct 31 #Javascript
json 入门基础教程 推荐
Oct 31 #Javascript
jquery text()要注意啦
Oct 30 #Javascript
You might like
php 表单数据的获取代码
2009/03/10 PHP
php获取apk包信息的方法
2014/08/15 PHP
THINKPHP项目开发中的日志记录实例分析
2014/12/01 PHP
权威JavaScript 中的内存泄露模式
2007/08/13 Javascript
asp.net网站开发中用jquery实现滚动浏览器滚动条加载数据(类似于腾讯微博)
2012/03/14 Javascript
javascript对下拉列表框(select)的操作实例讲解
2013/11/29 Javascript
js检测输入内容全为空格的方法
2014/05/03 Javascript
Node.js文件操作详解
2014/08/16 Javascript
前端必备神器 Snap.svg 弹动效果
2014/11/10 Javascript
JavaScript中的this关键字使用方法总结
2015/03/13 Javascript
js实现漂浮回顶部按钮实例
2015/05/06 Javascript
javascript实现点击商品列表checkbox实时统计金额的方法
2015/05/15 Javascript
理解JavaScript的变量的入门教程
2015/07/07 Javascript
jQuery Dialog对话框事件用法实例分析
2016/05/10 Javascript
在JavaScript中对HTML进行反转义详解
2016/05/18 Javascript
Jquery鼠标放上去显示全名的实现方法
2017/02/06 Javascript
Vue.js递归组件实现组织架构树和选人功能案例分析
2019/07/03 Javascript
使用 webpack 插件自动生成 vue 路由文件的方法
2019/08/20 Javascript
小程序接入腾讯位置服务的详细流程
2020/03/03 Javascript
[09:23]国际邀请赛采访专栏:iG战队VK,Tongfu战队Cu
2013/08/05 DOTA
[00:37]2016完美“圣”典风云人物:AMS宣传片
2016/12/06 DOTA
不管你的Python报什么错,用这个模块就能正常运行
2018/09/14 Python
解决Django migrate不能发现app.models的表问题
2019/08/31 Python
Python基础之列表常见操作经典实例详解
2020/02/26 Python
Python代码覆盖率统计工具coverage.py用法详解
2020/11/25 Python
HTML5触摸事件(touchstart、touchmove和touchend)的实现
2020/05/08 HTML / CSS
美国家喻户晓的保健品品牌:Vitamin World(维他命世界)
2016/08/19 全球购物
宏碁西班牙官网:Acer西班牙
2021/01/08 全球购物
给导游的表扬信
2014/01/10 职场文书
高二生物教学反思
2014/01/27 职场文书
辅导员评语
2014/05/04 职场文书
2014年小学重阳节活动策划方案
2014/09/16 职场文书
2014个人年终工作总结范文
2014/12/15 职场文书
教学副校长工作总结
2015/08/13 职场文书
CSS中em的正确打开方式详解
2021/04/08 HTML / CSS
MyBatis配置文件解析与MyBatis实例演示
2022/04/07 Java/Android