經典面試題:var 和 let 的區別

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章