Javascript中的范围链并在全局范围内调用嵌套函数

时间:2015-11-25 19:55:08

标签: javascript function scope execution chain

以下是我想要启发的例子(某些事实并非如此)。

 var myVar = 2;

    function a(){
     var myVar = 2;
        function b(){
            console.log(myVar);
        }
    };
   a();
   b();

这将在控制台中输出:Uncaught ReferenceError:b未定义。

正如您所看到的,我有一个名为 a 的函数,其函数名为 b

起初我以为我可以在 a 之外调用 b 并让它正常工作。 我认为这样可行,因为起初我称之为函数。

通过这样做,我想到了 a function 将放在执行堆栈上,并且在创建阶段,将设置内部定义的 b函数在记忆中。

因为这是在内存中我认为我可以在函数外执行它。这显然不起作用。

所以我的结论是 b函数确实在 a函数的创建阶段被设置到内存中,但是一旦 a函数具有完成执行后,一旦弹出执行堆栈, b函数就会同时从内存中弹出。

因此,在全局范围内调用它(我的意思是b函数)是不可能的。

我是对的吗?

2 个答案:

答案 0 :(得分:3)

通过谈论执行堆栈,创建阶段等,你会不必要地使事情变得复杂。

解释非常简单:您无法拨打b,因为规范说b超出了您尝试调用它的网站的范围。这就是故事的结尾。

如果转换为PHP,您的示例实际上会起作用,这让我觉得也许这就是您从中获得想法的地方。但JS和PHP是不同的语言,PHP处理嵌套函数的(IMO荒谬)方式不会转移。

答案 1 :(得分:0)

如果您想在b之外拨打a,则需要在a之外创建对其的引用:

var myVar = 2;

function a(){
  var myVar = 2;
  function b(){
      console.log(myVar);
  }
  return b;
};

var b = a();
b();

然而,这不会导致b打印全局myVar。它仍然可以访问myVar的封闭范围内的a