变量提升
// 函数声明:会把函数提升到开头
function test(){
console.log('test')
}
//函数先声明变量再赋值:变量提升undefined,再赋值var test1 = function(){
console.log('test')
}
js 代码编译并创建执行上下文
- 全局执行上下文(页面生命周期内只有一份)
- 函数调用,执行上下文
- 使用eval,代码会被编译,并创建执行上下文
栈(stack):后进先出
调用栈(执行上下文栈):管理执行上下文,js引擎将执行上下文压入栈中,执行完毕后,会将执行上下文弹出栈
var a = 3
function test(b, c) {
var d = 1
return add(b, c)
}
function add(b, c) {
return b * c
}
test(4, 5)
console.trace() 输出当前函数调用关系
栈溢出:调用栈空间被占满(没有终止条件的递归)
可以加入定时器来解决栈溢出?
像setTimeout 、setInterval Promise 这样的全局函数不是js 的一部分,而是webapi 部分。 当遇到webApi 时,会将其回调函数交给web apis 处理,此时 调用栈 中foo 函数执行完毕,出栈,栈为空; 回调函数会被发送到任务队列中,等待event loop 事件循环将其捞出 重新放入到堆栈中