let 和var的区别
时间: 2023-09-10 18:16:04 浏览: 104
es6 for循环中let和var区别详解
在JavaScript中,let和var都是用来声明变量的关键字,但它们有一些不同之处。
1. 作用域:var声明的变量是函数作用域或全局作用域,而let声明的变量是块级作用域。块级作用域指的是在if语句、循环语句、函数等代码块内声明的变量只在该代码块内有效,代码块外不可访问。
例如:
```
if (true) {
var a = 1;
let b = 2;
}
console.log(a); // 1
console.log(b); // Uncaught ReferenceError: b is not defined
```
在这个例子中,变量a使用var声明,在if语句块内部定义,但在if语句块外部仍然可以访问。而变量b使用let声明,在if语句块内部定义,只在if语句块内部有效,因此在if语句块外部访问变量b会抛出"Uncaught ReferenceError: b is not defined"错误。
2. 变量提升:使用var声明的变量会在其所在的函数或全局作用域内提升,即变量声明会被提升到作用域的顶部,但变量赋值并没有被提升。而使用let声明的变量不会被提升,只有在声明语句被执行时,变量才会被创建。
例如:
```
console.log(a); // undefined
var a = 1;
console.log(b); // Uncaught ReferenceError: b is not defined
let b = 2;
```
在这个例子中,变量a使用var声明,在其所在的函数或全局作用域内提升,因此第一次console.log输出undefined而不是抛出错误。而变量b使用let声明,没有变量提升,因此第二次console.log会抛出"Uncaught ReferenceError: b is not defined"错误。
3. 同名变量:在同一个作用域内,不允许使用let重复声明同名变量,否则会抛出"Uncaught SyntaxError: Identifier 'x' has already been declared"错误。而使用var声明的同名变量不会抛出错误,后面的变量会覆盖前面的变量。
例如:
```
let x = 1;
let x = 2; // Uncaught SyntaxError: Identifier 'x' has already been declared
var y = 1;
var y = 2; // 不会抛出错误
console.log(y); // 2
```
4. 全局对象属性:在全局作用域内使用var声明的变量会成为全局对象(window)的属性,而使用let声明的变量不会成为全局对象的属性。
例如:
```
var z = 1;
console.log(window.z); // 1
let w = 2;
console.log(window.w); // undefined
```
在这个例子中,变量z使用var声明,在全局作用域内定义,因此它成为全局对象的属性。而变量w使用let声明,在全局作用域内定义,但它不是全局对象的属性。
阅读全文