浏览器中js执行

153 阅读2分钟

执行上下文

变量提升

  • js代码执行过程中,需要先做变量提升,因为js在执行之前需要先编译;
  • 在编译阶段,变量和函数会放到变量环境中,默认值是undefined;在代码执行阶段js引擎会从变量环境中查找自定义的变量和函数;
  • 在编译阶段,若存在两个相同的函数,最后定义的会覆盖之前定义的。

在执行js时,可能存在多个执行上下文,js是通过栈来管理这些执行上下文的。

执行上下文流程:

  • 每调用一个函数,js引擎会为其创建执行上下文,并把其压入调用栈,然后js引擎开始执行函数代码
  • 如果在一个函数A中调用了函数B,那么js引擎会为函数B创建执行上下文,并将函数B的执行上下文移入栈顶
  • 当前函数执行完毕后,js引擎会将该函数执行上下文弹出栈
  • 当分配的调用栈空间被占满时,会引发堆栈溢出问题

作用域

作用域是指在程序中定义变量的区域,该位置决定了变量的生命周期。作用域就是变量与函数的可访问范围,即作用域控制着变量和函数的可见性和生命周期。

词法作用域

词法作用域是指作用域中由代码中函数声明的位置来决定的所以词法作用域是静态的作用域,通过他能够预测代码在执行过程中如何查找标识符。词法作用域是代码阶段就决定好的,和函数是怎么调用的没有关系。


function bar() {
    console.log(myName)
}
function foo() {
    var myName = "极客邦"
    bar()
}
var myName = "极客时间"
foo()

如上bar和foo的词法作用域开始就已经决定好是全局作用域,和bar在什么时候调用没有关系。