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 相关文章推荐
强悍无比的WEB开发好助手FireBug(Firefox Plugin)
Jan 16 Javascript
js实现鼠标悬停图片上时滚动文字说明的方法
Feb 17 Javascript
JSP基于Bootstrap分页显示实例解析
Jun 12 Javascript
JS上传图片预览插件制作(兼容到IE6)
Aug 07 Javascript
node.js中的事件处理机制详解
Nov 26 Javascript
ReactNative之键盘Keyboard的弹出与消失示例
Jul 11 Javascript
微信小程序js文件改变参数并在视图上及时更新【推荐】
Jun 11 Javascript
Vue中props的使用详解
Jun 15 Javascript
解决Vue中引入swiper,在数据渲染的时候,发生不滑动的问题
Sep 27 Javascript
详解微信小程序scroll-view横向滚动的实践踩坑及隐藏其滚动条的实现
Mar 14 Javascript
JavaScript逻辑运算符相关总结
Sep 04 Javascript
Node使用koa2实现一个简单JWT鉴权的方法
Jan 26 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简单实现发送带附件的邮件
2015/06/10 PHP
PHP使用星号隐藏用户名,手机和邮箱的实现方法
2016/09/22 PHP
PHP观察者模式原理与简单实现方法示例
2017/08/25 PHP
JS等比例缩小图片尺寸的实例
2013/02/27 Javascript
javascript数组操作总结和属性、方法介绍
2014/04/05 Javascript
jQuery实现拖拽效果插件的方法
2015/03/23 Javascript
浅谈javascript构造函数与实例化对象
2015/06/22 Javascript
JavaScript实现的浮动层框架用法实例分析
2015/10/10 Javascript
原生JS和jQuery版实现文件上传功能
2016/04/18 Javascript
超实用的JavaScript代码段 附使用方法
2016/05/22 Javascript
使用HTML5+Boostrap打造简单的音乐播放器
2016/08/05 Javascript
vue2.0开发实践总结之入门篇
2016/12/06 Javascript
JS实现的Unicode编码转换操作示例
2017/04/28 Javascript
vue v-on监听事件详解
2017/05/17 Javascript
Angular 4依赖注入学习教程之Injectable装饰器(六)
2017/06/04 Javascript
vuejs实现本地数据的筛选分页功能思路详解
2017/11/15 Javascript
微信小程序引入Vant组件库过程解析
2019/08/06 Javascript
微信小程序 导入图标实现过程详解
2019/10/11 Javascript
vue 检测用户上传图片宽高的方法
2020/02/06 Javascript
Python抓取Discuz!用户名脚本代码
2013/12/30 Python
Python 常用 PEP8 编码规范详解
2017/01/22 Python
Python数据分析之双色球统计单个红和蓝球哪个比例高的方法
2018/02/03 Python
python中datetime模块中strftime/strptime函数的使用
2018/07/03 Python
Python3实现的反转单链表算法示例
2019/03/08 Python
python中比较两个列表的实例方法
2019/07/04 Python
django连接mysql数据库及建表操作实例详解
2019/12/10 Python
纯HTML5+CSS3制作生日蛋糕代码
2016/11/16 HTML / CSS
Canvas环形饼图与手势控制的实现代码
2019/11/08 HTML / CSS
美国汽配连锁巨头Pep Boys官网:轮胎更换、汽车维修服务和汽车零部件
2017/01/14 全球购物
高中生校园生活自我评价
2013/09/19 职场文书
销售自荐信
2013/10/22 职场文书
优良学风班总结材料
2014/02/08 职场文书
飞机制造技术专业求职信
2014/07/27 职场文书
六一亲子活动感想
2015/08/07 职场文书
干货:企业内部人才推荐奖励方案!
2019/07/09 职场文书
详解Java实践之适配器模式
2021/06/18 Java/Android