如何理解JaveScript中的函数声明提升
2016-03-17 22:14
274 查看
说起来,JavaScrip中关于“声明提升”的说法,本质上是在编译器在进入可执行代码时会先准备环境。
以进入一段function代码为例:
第一步:创建可执行上下文(以下简称为EC),压入当前的EC栈中。EC中包括了以下信息:
词法环境(=环境记录项(保存变量、函数声明和形参)+ 外部词法环境(function的[[scope]]属性,作用域链的本质))
this的指向
变量环境(与环境记录项的值相同。但与环境记录项不同的是,这玩意儿之后不会再发生变动。)
第二步:收集函数声明、变量声明和形参,保存在环境记录项内。这个收集的过程,就是一般所谓的声明提升现象的本质。如果发现了重复的标识符,则优先级为函数声明 、形参 、var声明(优先级低的会被无视)。
第三步:开始执行代码,环境记录项内没有的标识符会根据作用域链查找标识符对应的值,环境记录项亦有可能因赋值语句而被修改。
第四步:函数执行完毕,EC栈被弹出、销毁。
作者:郑航
链接:https://www.zhihu.com/question/35363754/answer/62417711
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
以进入一段function代码为例:
第一步:创建可执行上下文(以下简称为EC),压入当前的EC栈中。EC中包括了以下信息:
词法环境(=环境记录项(保存变量、函数声明和形参)+ 外部词法环境(function的[[scope]]属性,作用域链的本质))
this的指向
变量环境(与环境记录项的值相同。但与环境记录项不同的是,这玩意儿之后不会再发生变动。)
第二步:收集函数声明、变量声明和形参,保存在环境记录项内。这个收集的过程,就是一般所谓的声明提升现象的本质。如果发现了重复的标识符,则优先级为函数声明 、形参 、var声明(优先级低的会被无视)。
第三步:开始执行代码,环境记录项内没有的标识符会根据作用域链查找标识符对应的值,环境记录项亦有可能因赋值语句而被修改。
第四步:函数执行完毕,EC栈被弹出、销毁。
作者:郑航
链接:https://www.zhihu.com/question/35363754/answer/62417711
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
相关文章推荐
- 数组中的逆序对
- 理解 HashMap 加载因子 loadFactor
- 前端学习总结(十二)ionic——媲美原生的h5跨平台移动应用开发框架
- Gson简要使用笔记
- 关于c++运算符重载
- Android pm命令详解
- github团队协作教程
- 1.0 2.0 3.0复利计算器
- 找工作总结 - 2014校招季 转载
- 《leetCode》:Reverse Linked List
- Hodoop HDFS NFS GateWay 挂载到其他机器深入详解
- 二叉树的深度
- 平衡二叉树
- Dearmweaver CS6 如何添加emmet 插件
- activity的横屏和竖屏设置
- iOS UITableView , UITableViewController ,UITableViewCell实现全国各省市遍历,选择相应的地区
- 脱坑之路-车站项目问题总汇
- Lost in the City
- 丑数
- zjnu 1739 PŠENICA()