LastPoem / Restart

2 stars 0 forks source link

执行上下文 #68

Open LastPoem opened 4 years ago

LastPoem commented 4 years ago

执行上下文Execution Context

每当控制器转到可执行代码时就会进入一个执行上下文。执行上下文可以理解为当前代码的执行环境,它会形成一个作用域,JavaScript的运行环境大概包括三种情况。

  1. 全局环境:JavaScript代码运行起来会首先进入该环境
  2. 函数环境:当函数被调用执行时,会进入当前函数中执行代码
  3. eval:不建议使用,可忽略

因此在一个JavaScript程序中,必定会产生多个执行上下文,JavaScript会以栈的方式来处理它们。这个栈称之为函数调用栈call stack。栈底永远都是全局执行上下文,而栈顶就是当前正在执行的上下文。

代码在执行过程中会遇到三种运行环境的情况,每次都会生成一个执行上下文,放入栈中,而处于栈顶的上下文执行完毕后,就会自动出栈。 执行上下文可以理解为函数执行的环境 ,每一个函数执行时,都会给对应的函数创建这样一个执行环境。

例:

var color = 'blue'

function changeColor() {
  var anotherColor = 'red'

  function swapColors() {
    var temColor = anotherColor
    anotherColor = color
    color = tempColor
  }

  swapColors()
}

changeColor()

在函数调用栈中,第一步是全局上下文入栈。 全局上下文入栈后,其中的可执行代码开始执行,直到遇到了changeColor(),这一句激活函数changeColor创建它自己的执行上下文,因此第二步就是changeColor的执行上下文入栈。

changeColor的上下文入栈后,控制器开始执行其中的可执行代码,遇到swapColors()后又激活了一个执行上下文。因此第三步是swapColors的执行上下文栈。 在swapColors的可执行代码中,再没遇到其它能生成执行上下文的情况,因此这段代码顺利执行完毕后,swapColors的执行上下文从栈中弹出。 swapColors的执行上下文弹出后,继续执行changeColor的可执行代码,也没有再遇到其他执行上下文,顺利执行完毕后弹出。这样,函数调用栈中就只剩下全局上下文了。 全局上下文在浏览器窗口关闭后出栈。

注意:函数中,遇到return能直接终止可执行代码的执行,因此会直接将当前上下文弹出栈。

  1. 对执行上下文的总结:
  2. 单线程
  3. 同步执行,只有栈顶的上下文处于执行中,其他上下文需要等待
  4. 全局上下文只有唯一一个,它在浏览器关闭时出栈
  5. 函数的执行上下文的个数没有限制
  6. 每次某个函数被调用,就会有个新的执行上下文为其创建,即使是调用的自身函数,也是如此
function f1() {
  var n = 999
  function f2() {
    alert(n)
  }
  return f2
}
var result = f1()
result()    // 999

在执行f1时,f2不会创建新的上下文,因为f2并没有在f1中调用。而直到执行result()时才创建了一个新的执行上下文。