《你不知道的JavaScript(上)》笔记——提升
2024-08-31 19:37:07
笔记摘自:《你不知道的JavaScript(上)》第3章 提升
1.包括变量和函数在内的所有声明都会在任何代码被执行前首先被处理。
2.变量和函数声明从它们在代码中出现的位置被“移动”到了最上面。这个过程就叫作提升。
3.只有声明本身会被提升,而赋值或其他运行逻辑会留在原地。
4.如果提升改变了代码执行的顺序,会造成非常严重的破坏。
5.思考以下代码:
foo(); function foo() {
console.log(a); // undefined
var a = 2;
}
foo函数的声明(这个例子还包括实际函数的隐含值)被提升了,因此第一行中的调用可以正常执行。
上面那段代码实际上会被理解为下面的形式:
function foo() {
var a;
console.log(a);
a = 2
} foo()
这样就好理解多了。
6.函数声明会被提升,但是函数表达式却不会被提升
思考以下代码:
foo(); // TypeError 类型错误,实际上它是undefined
bar(); // ReferenceError var foo = function bar() {
//...
}
这个代码片段经过提升后,实际上会被理解为以下形式:
var foo; foo(); // TypeError
bar(); // ReferenceError foo = function bar() {
//...
}
7.函数优先,函数会首先被提升,然后才是变量。
思考以下代码:
foo(); // var foo; function foo() {
console.log(1);
} foo = function() {
console.log(2);
}
结果输出1而不是2
这段代码会被引擎理解为如下形式:
function foo() {
console.log(1);
} foo(); // foo = function() {
console.log(2)
}
注意,var foo尽管出现在function foo() ...的声明之前,但它是重复的声明(因此被忽略了),因为函数声明会被提升到普通变量之前。
8.看以下代码:
var a = 2;
实际上JavaScript引擎是这样理解的:
var a;
a = 2;
9.声明本身会被提升,而包括函数表达式的赋值在内的赋值操作并不会提升。
最新文章
- MySQL安装与设置
- DataTable的数据批量写入数据库
- Android学习笔记(一)——安卓开发环境搭建
- asp.net将内容导出到Excel,Table表格数据(html)导出EXCEL
- How to build a GUI in ROS with Qt / C++
- 【NCDC数据】获取 hadoop权威指南3中的NCDC数据
- 为什么PCI-e比SATA快这么多?
- EventStore的设计思路
- HashMap方法介绍
- Problem - 1062 http://acm.hdu.edu.cn/showproblem.php?pid=1062
- sublime安装PackageControl提示失败(被墙了)
- Android中高级工程师面试题
- RGB、YUV和HSV颜色空间模型
- 3.静态AOP实现-代理模式
- 搭建Zookeepeer源码工程
- Linux进程共享通信 -- mmap实现
- 《C语言中分配了动态内存后一定要释放吗?》
- react 修改循环列表的当前单个子项状态:思路 拿原始state数据更改,再做请求
- NPOI 生成 Excel
- myeclipse的user library使用方法
热门文章
- 菜鸟之路——Java并发(二)ThreadLocal
- Cisco PIX防火墙PPPoE拨号配置视频教学
- Kinect 开发 —— 杂一
- [Python] Python's namedtuples can be a great alternative to defining a class manually
- NO.1 You must restart adb and Eclipse多种情形分析与解决方式
- JavaScript--数据结构与算法之列表
- javascript 幻灯片代码(含自动播放)
- C语言的多行宏定义
- ListCtrl添加右键菜单(ListCtrl类里编辑,给ListCtrl 发送NM_RCLICK消息)
- C# Aspect-Oriented Programming(AOP) 利用多种模式实现动态代理