经典面试题: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 定义变量。

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