声明提升
概念:变量和函数的声明会在物理层面移动到代码的最前面,但这么说也并不准确。实际上变量和函数在代码里的位置是不会变的,而是在编译阶段被放入内存中。
常见的示例如下:
var x = 1; // 声明 + 初始化 x
console.log(x + " " + y); // '1 undefined'
var y = 2; // 声明 + 初始化 y
//上面的代码和下面的代码是一样的
var x = 1; // 声明 + 初始化 x
var y; // 声明 y
console.log(x + " " + y); // y 是未定义的
y = 2; // 初始化 y
复制代码
关于let
- 不存在变量提升
a = 1;
var a;
console.log(a) // 1
b = 1;
let b;
console.log(b) // 引用报错 Uncaught ReferenceError: b is not defined
复制代码
- 作用域
let 的作用域是块级的
{var a = 1}
{let d = 1}
console.log(a)
console.log(d) // Uncaught ReferenceError: d is not defined
复制代码
- 不能重复声明
var a = 1;
var a = 2;
let b = 1;
let b = 2; // Uncaught SyntaxError: Identifier 'b' has already been declared
复制代码
- 暂时死区
console.log(a) // undefined
console.log(b) // 报错 Uncaught ReferenceError: b is not defined
var a = 1
var b = 1
复制代码
给一个例子来看一下输出结果:
var a = 1;
function b() {
a = 10;
return;
function a() {}
}
b();
console.log(a) // 1
// 解析:函数b 等同于以下写法
function b() {
var a = function () {}
a = 10
return
}
复制代码