1、var 有变量提升现象,let 不会。
先看一个代码:
console.info( x ); // undefined。因为在后面用 var 定义了变量。
var x = 100;
console.info(x); // 100
以上代码相当于:
var x ; // var 定义的变量被提升到前面来定义。这个现场就是 “变量提升”。
console.info( x ); // undefined。因为在后面用 var 定义了变量。
x = 100;
console.info(x); // 100
但是,如果直接使用一个变量,会报错。
console.info( y ); // 报错。没有定义变量 y,莫名其妙冒出来了一个变量。
let 定义的变量,必须先定义才使用,否则会报错。
console.info( x ); // 报错
let x = 100;
console.info(x);
2、let 可以在 {} 内定义局部变量,var 不会
{
var i = 100;
}
console.info(i); // 100。在{}外可以访问 var 定义的变量。
这是因为在ES6之前,我们都是用var来声明变量,而且JS只有函数作用域和全局作用域,没有块级作用域,所以{}
限定不了var声明变量的访问范围。
ES6新增的let
,可以在 {} 内定义局部变量。
{
let i = 100; // i变量只在 {} 内有效!!!
}
console.info(i); // 报错
3、let 不会暴露循环变量,var 会
for (let i = 0; i < 10; i++) {
// ...
}
console.info(i);
// ReferenceError: i is not defined
for (var i = 0; i < 10; i++) {
// ...
}
console.info(i);
// 10 。 在 for 循环外,可以访问循环变量 i
4、let变量不能重复声明
let a = 0;
let a = 'sss';
// Uncaught SyntaxError: Identifier 'a' has already been declared
var x = 100;
var x = 200 ;
console.info(x ); // 200
综上,let 显然更加的严谨,让我们写的代码更安全。所以,我们推荐使用 let 定义变量。