js执行机制1:执行上下文

319 阅读1分钟

变量提升

// 函数声明:会把函数提升到开头
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 事件循环将其捞出 重新放入到堆栈中

参考:juejin.cn/post/684490…