let
ES6 新增命令, 用于声明变量, 作用域只限于其代码块内, 而 var
则能用于整个代码块( function)内.
- 作用域
let
仅在其代码块内有效
var
全局或整个代码块 ( function )
function letTest() {
let x = 1;
if (true) {
let x = 2; // 不同的变量
console.log(x); // 2
}
console.log(x); // 1
}
function varTest() {
var x = 1;
if (true) {
var x = 2; // 同样的变量!
console.log(x); // 2
}
console.log(x); // 2
}
var a = 5;
var b = 10;
if (a === 5) {
let a = 4; // 作用于 if 代码块
var b = 1; // 作用于 function
console.log(a); // 4
console.log(b); // 1
}
console.log(a); // 5
console.log(b); // 1
let
定义的i
只有效于for
循环体
for (let i = 0; i < 10; i++) {
console.log(i); // 0, 1, 2, 3, 4 ... 9
}
console.log(i); // i 没有定义
let
定义的变量i
只作用于块级的代码块
var a = [];
for (let i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); // 6
- 而
var
定义变量i
能作用于全局范围, 所以console.log(i)
中的i
指向的是每次循环自增的变量i
var a = [];
for (var i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); // 10
let
不允许在相同作用域内,重复声明同一个变量
// 报错
function func() {
let a = 10;
var a = 1;
}
// 报错
function func() {
let a = 10;
let a = 1;
}
// 报错
function func(arg) {
let arg;
}
// 不报错
function func(arg) {
{
let arg;
}
}