区别
var
有全局作用域和函数作用域,没有块级作用域let
有全局作用域、函数作用域和块级作用域
var
可以在同一作用域下多次声明同一变量let
在同一作用域下同一变量只能声明一次
var
声明的变量可以在声明之前被调用(有声明提升)let
声明的变量不可以在声明之前被调用(没有声明提升)
代码演示
作用域
// var 有全局作用域和函数作用域,没有块级作用域
for (var i = 0; i < 10; i++) {
var a = 1; // 全局作用域
}
console.log(i); // 10
console.log(a); // 1
function f(){
var b = 1; // 函数作用域
}
f()
console.log(b); // 报错
// let 有全局作用域、函数作用域和块级作用域
for (let i = 0; i < 10; i++) {
let a = 1; // 块级作用域
}
console.log(i); // 报错
console.log(a); // 报错
function f(){
let b = 1; // 函数作用域
}
f()
console.log(b); // 报错
多次声明
// var 可以在同一作用域下多次声明同一变量
var a = 1;
var a = 2;
console.log(a); // 2
// let 在同一作用域下同一变量只能声明一次
let a = 1;
let a = 2; // 报错 SyntaxError: Identifier 'a' has already been declared
声明与调用
console.log(a); // undefined
var a = 1;
// let 声明的变量不可以在声明之前被调用
console.log(a); // 报错 ReferenceError: Cannot access 'a' before initialization
let a = 1;
声明提升
if (false) {
var c = 2; // 由于声明提升,声明会被执行,赋值不执行
}
console.log(c); // undefined
声明提升后等价于
var c;
if (false) {
c = 2;
}
console.log(c); // undefined