飞雪连天射白鹿,笑书神侠倚碧鸳

0%

块级作用域和变量提升

上一篇(js 中 var-let-const 的区别)通过变量声明的不同方式简单描述了区别
这一篇继续看看变量提升和函数提升


1
2
3
4
5
6
7
8
在群里看到一道题: var a = 0;
if (true) {
a = 1;
function a() {}
a = 21;
console.log("a1", a);
}
console.log("a2", a);

变量

var 声明的变量会提升至最顶层

let,const 的特殊声明也会提前,并标记为不可再声明

1
2
3
4
5
let x = 1;
console.log(x); // 正常打印

console.log(x); // 已声明未初始化
let x = 1;

函数

函数是【 定义函数名变量, 指针指向 函数内存块】

函数存在块级作用域

将函数声明提到函数级作用域最前面,然后将函数定义提升到块级作用域最前面

题目

1
2
3
4
5
6
7
var a; // 函数 a 的声明提前
var a = 0; // 赋值
if (true) {
function a() {} // 函数定义 a 声明提升到块级最前面
a = 1; // 块级作用域最前面的函数 a 重置为 1
a = 21;
}

结果:
a1 = ‘21’
a2 = ‘1’

听说,打赏我的人最后都找到了真爱
↘ 此处应有打赏 ↙
// 用户脚本