let、const、var的区别
先看这张表
| 声明方式 | 变量提升 | 作用域 | 初始值 | 重复定义 |
|---|---|---|---|---|
| var | 是 | 函数级 | 不需要 | 允许 |
| let | 否 | 块级 | 不需要 | 不允许 |
| const | 否 | 块级 | 需要 | 不允许 |
简单理解函数作用域:函数体的子嵌套函数可以访问父函数体的变量。这种关系是可以继承的,子嵌套函数可以访问父、爷函数体的变量。
我们一起来看几个案例,以便更好的理解var~~~~
// 难度1
var num = 10;
fn1();
function fn1() {
console.log(num); // underfind
var num = 20;
console.log(num); // 20
}
console.log(num); // 10
// 2 --难度加1
var num = 10;
fn1();
function fn1() {
console.log(num); // 10
num = 20;
console.log(num); // 20
}
console.log(num); // 20
// 3 --难度加2
var num = 123
function f1(num) {
console.log(num) // 456
}
function f2() {
var num = 456
f1(num)
}
f2()
// 4 --
var num1 = 10;
var num2 = 20;
function fn(num1) {
num1 = 100;
num2 = 200;
num3 = 300;
console.log(num1); // 100
console.log(num2); // 200
console.log(num3); // 300
var num3;
}
fn();
console.log(num1); // 10
console.log(num2); // 200
console.log(num3); // num3 is not defined
let、const、声明的变量,在for,if语句中,会形成块级作用域,块级作用域内的变量,不能被作用域外部使用
// 块级作用域
if(1){
const str= "str"
console.log(str) // str
}
console.log(str) // str is not defined
const num= 100
if(1){
console.log(num) // Cannot access 'num' before initialization
const num= 200 // 没有变量提升,且为块级作用域
}
let、const声明的变量不存在变量提升,在变量声明之前使用会报错~~~
const声明的是一个常量,声明同时必须初始化,否则报错~~~
const num;
num= 300
console.log(num) // Missing initializer in const declaration
如果const声明的是基本数据类型的常量,初始化之后不能修改;如果是复杂数据类型,可以修改其成员变量
const num = 500;
num= 600 // Assignment to constant variable.
const arr = [0,1,2]
arr[0] = 8
console.log(arr) // [8,1,2]
\