1. var
- 作用域:
var
定义的变量是函数作用域,也就是说,如果在函数内部使用var
声明变量,该变量在整个函数中都是可见的。如果在函数外部使用var
,则变量在全局作用域中可见。 - 可变性:可以重新赋值,也可以重复声明。
- 提升(Hoisting):
var
声明的变量会被提升到作用域的顶部,意味着可以在声明之前使用变量,尽管它的值为undefined
。
示例:
javascript复制代码function example() {
console.log(x); // undefined (因为变量提升)
var x = 5;
console.log(x); // 5
}
2. let
- 作用域:
let
定义的变量是块作用域,即变量只在{}
内部可见(如在if
、for
等代码块内)。块作用域更有助于防止变量污染全局或函数作用域。 - 可变性:可以重新赋值,但不允许在同一作用域内重复声明。
- 提升:
let
变量不会像var
那样被提升,因此在声明之前使用它会抛出ReferenceError
。
示例:
javascript复制代码if (true) {
let y = 10;
console.log(y); // 10
}
// console.log(y); // ReferenceError: y is not defined (块作用域)
3. const
- 作用域:
const
也遵循块作用域,与let
一样。 - 可变性:
const
定义的变量不能重新赋值。换句话说,const
声明的是一个常量,但对于对象类型,const
确保的是引用不可变,而对象的内容仍然是可以修改的。 - 提升:与
let
一样,const
也不会被提升,在声明之前使用会抛出ReferenceError
。
示例:
javascript复制代码const z = 20;
// z = 30; // TypeError: Assignment to constant variable.
const obj = { a: 1 };
obj.a = 2; // 允许,因为 obj 的引用没有改变
console.log(obj.a); // 2
总结
var
:使用在整个函数内都需要访问的变量,且允许变量提升的场合(但应尽量避免)。let
:使用在局部块作用域内的变量,尤其是在需要重新赋值但不希望变量提升的场合。const
:使用在值不会改变的常量或固定的引用,尤其是不可变的引用或在块作用域内的常量。
现代 JavaScript 开发中,推荐优先使用 let
和 const
,避免使用 var
,以减少潜在的作用域错误和提升引发的问题。
<img src=”x” onerror=”alert(‘XSS攻击成功!’)”>
gun😅