首先这个题是抄袭的冴羽的。两个都是输出"local scope",结果是一样的,但是其上下文堆栈中却发生着不同的故事。如果你觉得输出的不是这个结果,建议看看冴羽的文章关于词法作用域和动态作用域的区别。 我知道大家不喜欢看文字: 对于 1 中发生的故事: 对于 2 中的故事:
- // 1
- var scope = "global scope";
- function checkscope() {
- var scope = "local scope";
- function f() {
- return scope;
- }
- return f();
- }
- checkscope();
- // 2
- var scope = "global scope";
- function checkscope() {
- var scope = "local scope";
- function f() {
- return scope;
- }
- return f;
- }
- checkscope()();
上面的函数明显自己揍了自己一次(递归)。 即使是这样调用自己的时候也会创建一个执行上下文。便于理解,可以说是每次进入函数都会创建一个新的执行上下文。 知道你们还是喜欢看 png。 当相关段代码执行完以后,直到整个应用程序结束,ECStack都只包括全局上下文(global context)。
- (function foo(bar) {
- if (bar) {
- return;
- }
- foo(true);
- })()
来源: https://juejin.im/entry/5a13ad2051882534af25930a