变量提升和函数提升
cooljser 2023-08-22 javascript
(function b() {
console.log(b);
b = 20;
console.log(b);
})();
// function body
// function body
1
2
3
4
5
6
7
2
3
4
5
6
7
js 引擎规定,IIFE 函数名称是不允许更改的,非严格模式下静默失败,严格模式下会报错: "Uncaught TypeError: Assignment to constant variable."
所以 b = 20; 这一行代码执行是无效的,两次输出都是函数体
- 带 var 和不带 var 声明变量
- 变量声明提升
- 函数声明提升,函数声明提升优先级高于变量声明提升
- 函数形参不会再被声明
# IIFE 的作用
- 避免全局变量污染
- 形成作用域,进行初始化
# 一些题目
function a() {}
var a;
console.log(a); // 函数声明优先级高于变量声明 function a
1
2
3
2
3
var a = 1;
function fn() {
a = 2;
console.log(a); // 2
var a = 3;
console.log(a); // 3
}
fn();
console.log(a); // 1,函数是有自己的作用域的,所以函数内部相当于执行了下面的代码
var a = undefined;
a = 2;
a = 3;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15