Open LastPoem opened 4 years ago
执行上下文Execution Context
每当控制器转到可执行代码时就会进入一个执行上下文。执行上下文可以理解为当前代码的执行环境,它会形成一个作用域,JavaScript的运行环境大概包括三种情况。
因此在一个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能直接终止可执行代码的执行,因此会直接将当前上下文弹出栈。
function f1() { var n = 999 function f2() { alert(n) } return f2 } var result = f1() result() // 999
在执行f1时,f2不会创建新的上下文,因为f2并没有在f1中调用。而直到执行result()时才创建了一个新的执行上下文。
执行上下文Execution Context
每当控制器转到可执行代码时就会进入一个执行上下文。执行上下文可以理解为当前代码的执行环境,它会形成一个作用域,JavaScript的运行环境大概包括三种情况。
因此在一个JavaScript程序中,必定会产生多个执行上下文,JavaScript会以栈的方式来处理它们。这个栈称之为函数调用栈call stack。栈底永远都是全局执行上下文,而栈顶就是当前正在执行的上下文。
代码在执行过程中会遇到三种运行环境的情况,每次都会生成一个执行上下文,放入栈中,而处于栈顶的上下文执行完毕后,就会自动出栈。 执行上下文可以理解为函数执行的环境 ,每一个函数执行时,都会给对应的函数创建这样一个执行环境。
例:
在函数调用栈中,第一步是全局上下文入栈。 全局上下文入栈后,其中的可执行代码开始执行,直到遇到了changeColor(),这一句激活函数changeColor创建它自己的执行上下文,因此第二步就是changeColor的执行上下文入栈。
changeColor的上下文入栈后,控制器开始执行其中的可执行代码,遇到swapColors()后又激活了一个执行上下文。因此第三步是swapColors的执行上下文栈。 在swapColors的可执行代码中,再没遇到其它能生成执行上下文的情况,因此这段代码顺利执行完毕后,swapColors的执行上下文从栈中弹出。 swapColors的执行上下文弹出后,继续执行changeColor的可执行代码,也没有再遇到其他执行上下文,顺利执行完毕后弹出。这样,函数调用栈中就只剩下全局上下文了。 全局上下文在浏览器窗口关闭后出栈。
注意:函数中,遇到return能直接终止可执行代码的执行,因此会直接将当前上下文弹出栈。
在执行f1时,f2不会创建新的上下文,因为f2并没有在f1中调用。而直到执行result()时才创建了一个新的执行上下文。