1. var
在ES5及之前的JavaScript版本中,我们通常使用var关键字声明变量。var存在以下特性:
- 函数作用域:
var声明的变量在整个函数体内都是可见的,而在块级作用域内则无效。这可能导致变量泄漏的问题。 - 变量提升: 使用
var声明的变量会被提升到函数的顶部或全局作用域的顶部。这意味着你可以在声明之前访问变量,但其值会是undefined。
console.log(x); // undefined
var x = 5;
console.log(x); // 5
2. let
ES6引入了let关键字,它改善了var存在的一些问题:
- 块级作用域: 使用
let声明的变量具有块级作用域,只在其声明的块或语句中可见。
function f1() {
let n = 5;
if (true) {
let n = 10;
}
console.log(n); // 5
}
上面的函数有两个代码块,都声明了变量n,运行后输出 5。这表示外层代码块不受内层代码块的影响。如果两次都使用var定义变量n,最后输出的值才是 10。
- 不会变量提升: 与
var不同,let声明的变量不会被提升,访问未声明前的变量会导致引用错误。
console.log(y); // ReferenceError: y is not defined
let y = 10;
console.log(y); // 10
- 不允许重复声明 :
let不允许在相同作用域内,重复声明同一个变量。
3. const
const关键字用于声明常量,其特性包括:
- 块级作用域: 类似于
let,const声明的变量也具有块级作用域。 - 不可重新赋值: 一旦使用
const声明变量并赋值,就无法再次重新赋值给该变量。这使得const常用于声明不变的常量。
const PI = 3.14;
PI = 3; // TypeError: Assignment to constant variable.
总结
一般而言,推荐使用let和const,因为它们更安全,有助于避免一些潜在的问题。使用const来声明常量,而对于需要重新赋值的变量则使用let。