每当控制器执行代码的时候,都会进入一个执行上下文。
一系列的执行上下文可以看作是一个栈,栈是一个后进先出的原则,按照作用域链来看,它会一层一层的往外面寻找,直到全局,所以说全局上下文总是在栈的底部,而当前活动的执行上下文会在栈的顶部。
当控制器进入一个函数时,都会进行压栈的操作;当控制器退出一个函数时,都会执行退栈的操作;当抛出未捕获的异常是,也会执行退栈的操作。
举个例子:
var name = 'ck';
function getName(){
var age = 20;
console.log(name);
}
getName(); // ck
开始函数getName激活时:
ECStack=[
functionContext
globalContext
]
寻找变量name时:
ECStack=[
globalContext
]
因为函数里没有变量name,控制器会在全局变量中寻找name