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 相关文章推荐
用js实现键盘方向键翻页功能的代码
Jun 03 Javascript
JavaScript 基于原型的对象(创建、调用)
Oct 16 Javascript
javascript高级学习笔记整理
Aug 14 Javascript
jQueryUI写一个调整分类的拖放效果实现代码
May 10 Javascript
js中把JSON字符串转换成JSON对象最好的方法
Mar 21 Javascript
JS根据年月获得当月天数的实现代码
Jul 03 Javascript
js怎么判断flash swf文件是否加载完毕
Aug 14 Javascript
node.js中的fs.lchownSync方法使用说明
Dec 16 Javascript
纯javascript实现自动发送邮件
Oct 21 Javascript
livereload工具实现前端可视化开发【推荐】
Dec 23 Javascript
Vue.directive 自定义指令的问题小结
Mar 04 Javascript
利用js canvas实现五子棋游戏
Oct 11 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采用curl模仿用户登陆新浪微博发微博的方法
2014/11/07 PHP
ThinkPHP实现静态缓存和动态缓存示例代码
2017/05/02 PHP
laravel框架实现为 Blade 模板引擎添加新文件扩展名操作示例
2020/01/25 PHP
用ADODB.Stream转换
2007/01/22 Javascript
javascript 函数式编程
2007/08/16 Javascript
JavaScript CSS修改学习第三章 修改样式表
2010/02/19 Javascript
3Z版基于jquery的图片复选框(asp.net+jquery)
2010/04/12 Javascript
JS操作图片(增,删,改) 例子
2013/04/17 Javascript
js取整数、取余数的方法
2014/05/11 Javascript
JavaScript小技巧整理
2015/12/30 Javascript
深入理解Ajax的get和post请求
2016/06/02 Javascript
把json格式的字符串转换成javascript对象或数组的方法总结
2016/11/03 Javascript
浅谈JavaScript中的apply/call/bind和this的使用
2017/02/26 Javascript
vue-cli如何快速构建vue项目
2017/04/26 Javascript
vue实现文章内容过长点击阅读全文功能的实例
2017/12/28 Javascript
JS实现的集合去重,交集,并集,差集功能示例
2018/03/13 Javascript
使用淘宝镜像cnpm安装Vue.js的图文教程
2018/05/17 Javascript
vue组件之间的数据传递方法详解
2019/04/19 Javascript
JS实现图片切换特效
2019/12/23 Javascript
JS实现轮播图效果
2020/01/11 Javascript
详解微信小程序工程化探索之webpack实战
2020/04/20 Javascript
[04:29]2016国际邀请赛中国区预选赛Ehome战队教练采访
2016/06/27 DOTA
python将文本分每两行一组并保存到文件
2018/03/19 Python
python 通过类中一个方法获取另一个方法变量的实例
2019/01/22 Python
python GUI库图形界面开发之PyQt5 MDI(多文档窗口)QMidArea详细使用方法与实例
2020/03/05 Python
Python爬虫防封ip的一些技巧
2020/08/06 Python
html5的websockets全双工通信详解学习示例
2014/02/26 HTML / CSS
移动端html5模拟长按事件的实现方法
2018/09/30 HTML / CSS
伯克斯奥特莱斯:Burkes Outlet
2019/03/30 全球购物
CheapTickets香港机票预订网站:CheapTickets.hk
2019/06/26 全球购物
英国男女豪华配饰和礼品网站:Black.co.uk
2020/02/28 全球购物
一年级语文教学反思
2014/02/13 职场文书
报告会主持词
2014/04/02 职场文书
2014年最新个人对照检查材料范文
2014/09/25 职场文书
2022年显卡天梯图(6月更新)
2022/06/17 数码科技
AndroidStudio图片压缩工具ImgCompressPlugin使用实例
2022/08/05 Java/Android