js函数的执行时机
- 普通函数调用
let a = 1;
function fn() {
console.log(a);
}
// 只有调用了之后才会打印
fn();
- timeout打印case1
let i = 0;
for (i = 0; i <6; i++){
setTimeout(() => {
console.log(i);
},0)
}
// 打印结果
6 6 6 6 6 6
// setimeout是在所有代码执行完之后在会执行,所在for循环会先执行完,
// i不停累加,直到for循环执行完,i累加到6, 所以会打印出6个
- timeout打印case2
for (let i = 0; i <6; i++){
setTimeout(() => {
console.log(i);
},0)
}
// 打印结果
0 1 2 3 4 5
// setimeout是在所有代码执行完之后在会执行,但是let与for结合使用的话,
// 在每一次循环的时候,会产生一个拷贝的i,给console.log使用,所以会打印出0到5
调用栈
概念
- js引擎在调用一个函数前,需要把函数所在的环境push到一个数组里面,这个数组叫做调用栈,等函数执行完了,就会把环境弹出来(pop),然后return到之前的环境,继续执行后续代码
例如
console.log(1)
console.log('1+2的结果是' + add(1,2));
console.log(2)

- 如果调用栈中压入的帧过多,程序就会崩溃
函数提升
什么是函数提升
function fn(){}
// 不管把具名函数声明在哪里,他都会跑到第一行
什么不是函数提升
let fn = function(){}
// 复制操作,右边的匿名函数则不会被提升
this调用的两种方法
- 第一种
person.sayHi();
// 会自动把person传到函数中,做为this
- 第二种(推荐使用)
person.sayHi.call(person);
// 手动把person传到函数中,做为this