谈谈javascript中的变量提升还有函数提升
2024-08-27 18:40:12
在很多面试题中,经常会看到关于变量提升,还有函数提升的题目,所以我就写一篇自己理解之后的随笔,方便之后的查阅和复习。
首先举个例子
foo();//undefined
function foo(){
console.log(a);//undefined
var a = 10;
}
上面的例子中,foo()
函数的声明在调用之后,但是还是会输出函数中的结果。在foo()
函数的内部,变量a
的声明之前就调用了,但是系统会输出undefined
,而不会报错,这里面就涉及到了变量提升
还有函数提升
,为什么会出现这样的情况呢,先来了解几个重要的概念,就可以解开这个谜底了。
一、什么是执行上下文
每次当控制器转到可执行代码的时候,就会进入一个可执行上下文。执行上下文可以理解为当前代码的执行环境,它会形成一个作用域。
一个执行上下文的生命周期
从图中可以看出,一个执行上下文的生命周期包括创建
和执行
两个阶段。
1、第一个阶段中做的工作有:
- 生成变量对象
- 建立作用域链
- 确定this的指向
2、第二个阶段中做的工作有:
- 变量赋值
- 函数引用
- 执行其他代码
到这里还不能解析为什么会有变量提升和函数提升的过程,那么我们接下来再深入执行上下文
中的创建
阶段中的生成变量对象的过程
什么是变量对象
在很多面试题中,会考到变量对象和活动对象的区别,其实活动对象和变量对象是同一个对象,只是处于执行上下文的不同生命周期而已,活动对象处于执行阶段。
从图中可以看出,在生成变量对象的过程中,执行的操作有三步
1、创建arguments对象
2、检查functfen函数声明创建属性
3、检查var变量声明创建属性
所以在了解完执行上下文和变量对象后,就可以分析一下我们的问题了。
当我们执行第一句话的时候foo()
,javascript引擎会创建一个执行上下文testEc
,并且生成一个变量对象VO
,首先创建argument对象
,然后检查function
函数声明并且创建一个属性,所以就生成了如下的vo对象
创建过程
testEC = {
// 变量对象
VO: {},
scopeChain: {},
this: {}
}
// 因为本文暂时不详细解释作用域链和this,所以把变量对象专门提出来说明
// VO 为 Variable Object的缩写,即变量对象
VO = {
arguments: {...}, //注:在浏览器的展示中,函数的参数可能并不是放在arguments对象中,这里为了方便理解,我做了这样的处理
foo: <foo reference> // 表示foo的地址引用
a: undefined
}
变量提升也是同样的道理。
最新文章
- apt-get 相關設定
- nodejs实现的简单接口
- CLR via C#(17)--接口
- Linux_04------Linux权限的设定
- 使ViewStub 来提高UI的加载的性能
- psd图片到html
- hadoop2.2原理:采样器
- 字符串查找函数 find()函数
- 王立平--Failed to push selection: Read-only file system
- Linux Yum仓库介绍及服务端及客户端配置
- Oozie时出现Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure?
- 聊聊Java的字节码
- Jenkins&#160;Jenkins构建历史记录处理
- dubbo源码分析4——SPI机制_ExtensionFactory类的作用
- abap function module中的异常处理
- while循环、break、continue
- Java反射机制的使用(全)
- BitDefender(比特梵德)特惠活动 免费获取9个月激活码
- Spring和Quartz集成
- 20155117王震宇 2006-2007-2 《Java程序设计》第二周学习总结
热门文章
- Java 常见BUG 整理
- Windows 安装 MySQL 8.0.11
- error:0906D064:PEM routines:PEM_read_bio:bad base64 decode
- Delphi XE7的蓝牙 Bluetooth
- hexo博客更换主题
- nRF52832 BLE_DFU空中升级OTA(一)安装软件(SDK14.2.0)
- STM32 Startup**.s文件中使用的 __main C函数入口
- sort与qsort的异同
- NetWork——TCP的流量控制和拥塞控制
- 【LG4587】[FJOI2016]神秘数