1var 存在变量提升(Hoisting),变量声明会被提升到作用域顶部,但赋值不会。
console.log(a); // undefined
var a = 10;
等价于
var a;
console.log(a); // undefined
foo = a;
2函数声明 vs 函数表达式 + 变量提升考题(函数声明先提升var 只提升声明赋值留在原地执行)

JS 在真正执行代码前会做一件事:
🔥 先"提升"变量声明和函数声明
1️⃣ 函数声明优先级最高
function foo() {}
2️⃣ var 变量声明会提升
var foo
只提升声明,不提升赋值
console.log(foo); // ?
var foo = function () {
console.log("foo");
};
foo(); // ?
function foo() {
console.log("function foo");
}
foo(); // ?
关键点:
函数声明会覆盖 var 声明
但不会覆盖后面的赋值
// 函数声明提升(覆盖变量声明)
function foo() {
console.log("function foo");
}
// var 声明被忽略(因为函数已经声明过 foo)
var foo;
console.log(foo);
foo = function () {
console.log("foo");
};
foo();
foo();
开始逐行执行
console.log(foo);1
最终输出结果
ƒ foo() { console.log("function foo"); }
foo
foo
题1

function a() {}
var a;
console.log(a);
a = 1;
console.log(a);
函数申明最上面提升到会直接覆盖变量申明
题2

✅ 第三组:作用域 + var
题3:闭包 + var


题4面试杀手题

题5(最后一个函数声明覆盖前一个:就是function a会被后面同样的函数申明 function b 覆盖)


6val申明:this 高级题


for (var i = 0; i < 3; i++) {
Promise.resolve().then(() => {
console.log(i);
});
}


7asycn事件循环(
-
await 之前是同步
-
await 之后是微任务
)async 函数本身是同步执行的
只有 await 之后才是异步


