// demo02.js
function f1(){
var n=999;
function f2(){
alert(n);
}
return f2;
}
var result=f1();
result(); // 999
这是一个简单的闭包例子。对于某些人来说整个例子具有一定的迷惑性。
但是我们只需要根据“函数执行时才会创建执行上下文”的原则来理解,那么这段代码执行时的函数调用栈顺序相信也不会太难理解。
第一步:仍然是全局上下文先入栈。
第二步:全局代码在执行过程中,遇到了f1()执行。var result=f1();
因此f1会创建对应的执行上下文并入栈。
第三步:在f1的可执行代码中,虽然声明了一个函数f2,但是并没有发现任何函数执行,因此也就不会有别的上下文产生,代码执行结束之后,f1自然会出栈。
第四步:f1出栈之后,继续执行全局上下文的代码,这个时候遇到了`result();`。result的执行当然会创建一个新的上下文,因此这个时候result的上下文入栈。
第五步:result其实就是在f1中声明的函数f2,因此这个时候会执行f2中的代码。在f2中没有发现新的上下文产生。因此执行完毕后直接出栈。
完整过程图如下: