1.let与var的区别
let 跟var 的作用差不多,但有着非常重要的区别。最明显的区别是,let 声明的范围是块作用域,而var 声明的范围是函数作用域。
(块级作用域:一对大括号就可以看成是一块,在这块区域中定义的变量,只能在这个区域中使用,但是在js中在这个块级作用域中定义的变量,外面也能使用。说明:js没有块级作用域,,只有函数除外。)
块级作用域原创链接:JavaScript 的变量的全局作用域、局部作用域、块级作用域理解_奋斗的吧小菜鸟的博客-CSDN博客_全局作用域和局部作用域和块级作用域
let 也不允许同一个块作用域中出现冗余声明,这样会导致报错 。JavaScript引擎会记录用于变量声明的标识符及其所在的块作用域,因此嵌套使用相同的标识符不会报错,而这是因为同一个块中没有重复声明
var name = 'Nicholas';
console.log(name); // 'Nicholas'
if (true) {
var name = 'Matt';
console.log(name); // 'Matt'
}
let age = 30;
console.log(age); // 30
if (true) {
let age = 26;
console.log(age); // 26
}
let 与var 的另一个重要的区别,就是let 声明的变量不会在作用域中被提升
if (true) {
var name = 'Matt';
console.log(name); // Matt
}
console.log(name); // Matt
if (true) {
let age = 26;
console.log(age); // 26
}
console.log(age); // ReferenceError: age没有定义
用let 之后,for 循环定义的迭代变量会渗透到循环体外部这个问题就消失了,因为迭代变量的作用域仅限于for 循环块内部
for (var i = 0; i < 5; ++i) {
// 循环逻辑
}
console.log(i); // 5
for (let i = 0; i < 5; ++i) {
// 循环逻辑
}
console.log(i); // ReferenceError: i没有定义
2.const与let
const 的行为与let 基本相同,唯一一个重要的区别是用它声明变量时必须同时初始化变量,且尝试修改const 声明的变量会导致运行时错误。
const age = 26;
age = 36; // TypeError: 给常量赋值
// const也不允许重复声明
const name = 'Matt';
const name = 'Nicholas'; // SyntaxError
// const声明的作用域也是块
const name = 'Matt';
if (true) {
const name = 'Nicholas';
}
console.log(name); // Matt
虽然const 变量跟let 变量很相似,但是不能用const 来声明迭代变量(因为迭代变量会自增)
for (const i = 0; i < 10; ++i) {} // TypeError:给常量赋值
3.使用
尽量不使用var,const 优先,let 次之