let和const是ES6新增的两个重要的JavaScript关键字,用于声明变量
let
(1) 概念:let声明的变量只在let命令所在的代码块内有效
(2) 基本用法
{
let a = 0;
console.log(a); // 0
}
console.log(a); // 报错
(3) 特点
① 只在代码块内有效:let 是在代码块内有效,var 是在全局范围内有效
{
let a = 0;
var b = 1;
}
console.log(a); // 报错
console.log(b); // 1
② 不能重复声明:let 只能声明一次 ,var 可以声明多次
let a = 1;
let a = 2; //报错
var b = 3;
var b = 4;
console.log(a);
console.log(b); // 4
(4) let和var在for循环中的使用
for (var i = 0; i < 10; i++) {
setTimeout(function() {
console.log(i); // 输出十个 10
})
}
for (let j = 0; j < 10; j++) {
setTimeout(function() {
console.log(j); // 输出 0123456789
})
}
var:var声明的变量i在全局范围内有效,所以全局中只有一个变量i,每次循环时,setTimeout 定时器里面的 i 指的是全局变量 i ,而循环里的十个 setTimeout 是在循环结束后才执行,所以此时的 i 都是 10。
let:let声明的变量只在本轮循环中有效,每次循环j都是一个新的变量,所以 setTimeout 定时器里面的 j 其实是不同的变量,即最后输出 12345。(若每次循环的变量 j 都是重新声明的,如何知道前一个循环的值?这是因为 JavaScript 引擎内部会记住前一个循环的值)。
(5) let不存在变量提升(即预解析)
console.log(a); //报错
let a = "apple";
console.log(b); //undefined
var b = "banana";
预解析详细:https://blog.csdn.net/qq_54282411/article/details/120524767?spm=1001.2014.3001.5501
const
(1) 概念:const声明一个只读的常量,一旦声明,常量的值就不能改变。意味着一旦声明必须初始化,否则会报错。
(2) 基本用法
const PI = "3.1415926";
console.log(PI); // 3.1415926
const MY_AGE; //SyntaxError: Missing initializer in const declaration
(3) 不存在变量提升
var PI = "a";
if (true) {
console.log(PI); //报错
const PI = "3.1415926";
}
ES6 明确规定,代码块内如果存在 let 或者 const,代码块会对这些命令声明的变量从块的开始就形成一个封闭作用域。代码块内,在声明变量 PI 之前使用它会报错。
区别
var声明的是全局变量,可以被修改,可以重复声明
for (var i = 0; i < 10; i++) {
var a = 10;
console.log(a); //输出十个10
}
console.log(a); //输出10
for (var i = 0; i < 10; i++) {
var a = 10;
a = 20; //修改
console.log(a); //输出十个20
}
console.log(a); //输出20
for (var i = 0; i < 10; i++) {
var a = 10;
var a = 30; //重复声明
console.log(a); //输出十个30
}
console.log(a); //输出30
let声明的变量为一个代码块里的变量,可以被修改,但是不能被重复声明
for (var i = 0; i < 10; i++) {
let a = 20;
console.log(a); //输出十个20
}
console.log(a); //报错,找不到a
for (var i = 0; i < 10; i++) {
let a = 20;
a = 30; //修改
console.log(a); //输出十个30
}
console.log(a); //报错,找不到a
for (var i = 0; i < 10; i++) {
let a = 20;
let a = 40; //报错不能重新声明,后面的代码不被执行
console.log(a);
}
console.log(a);
const声明的变量为一个代码块里的变量,不可以被修改,不能被重复声明(如果const声明了一个数组,不能直接向数组里面添加值,只能通过push()向数组内部传值)
for (var i = 0; i < 10; i++) {
const a = 30;
console.log(a); //输出十个30
}
console.log(a); //报错,找不到a
for (var i = 0; i < 10; i++) {
const a = 30;
a = 40; //报错不能重新赋值,后面的代码不被执行
console.log(a);
}
console.log(a);
for (var i = 0; i < 10; i++) {
const a = 30;
const a = 50; //报错不能重新声明,后面的代码不被执行
console.log(a);
}
console.log(a);