我是目录
- 引言
- 声明提升
-
-
- 声明提升的理解
- 函数表达式
- 声明提升总结
-
- 代码生成与查找变量的过程
-
- 代码生成
-
- 词法分析( Tokenizing/Lexing)
- 语法分析( Parsing)
- 代码生成
- 生成代码总结
- 查找变量
- 不同版本中的执行上下文
-
- 不同版本对执行上下文的定义
- let/const
-
- let特点
- const特点
- let/const声明的变量,是否还会变量提升?
- let/const是如何实现块级作用域的?
引言
上一篇作用域、执行上下文与闭包中,主要介绍的是概念,其中涉及很多细节和考点并没有详述。这一篇查缺补漏,讲一些有时候会考的东西(大概碰到过一两次?)。
声明提升
引擎会在解释 JavaScript 代码之前首先对其进行编译。 编译阶段中的一部分工作就是找到所有的声明, 并用合适的作用域将它们关联起来。包括变量和函数在内的所有声明都会在任何代码被执行前首先被处理。这个过程就好像变量和函数声明从它们在代码中出现的位置被“移动”到了最上面。 这个过程就叫作提升。
每个作用域都会进行提升操作,函数声明和变量声明都会被提升。
foo();
bar();
var foo = function bar() {
// ...};
上段代码将被看成,所以会报错:
var foo;
foo(); // TypeError
bar(); // ReferenceError
foo = function() {
var bar = ...self...// ...
}
但是一个值得注意的细节是函数会首先被提升, 然后才是变量。后面的函数声明还是可以覆盖前面的函数声明。
foo(); // 1
var foo;
function foo() {
console.log( 1 );
}
foo = function() {
console.log( 2 );
};
会输出 1 而不是 2 ! 这个代码片段会被引擎理解为如下形式:
function foo() {
console.log( 1 );
}
foo(); // 1
foo = function() {
console