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 定義變量。