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

Scope chain in Javascript and calling nested function within the global scope

这是我想要启发的例子(实际上不起作用的东西)。

 var myVar = 2;

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

这将在控制台输出:Uncaught ReferenceError: b is not defined.

如您所见,我有一个名为 a 的函数和一个名为 b.

的嵌套函数

起初我以为我可以在 a 之外调用 b 并让它正常工作。 我认为这会起作用,因为起初我调用了一个函数。

通过这样做,我想到了一个事实,即 a 函数 将被放入执行堆栈,并且在其创建阶段 b 函数里面定义的会被设置到内存中。

因为这是在内存中,所以我想我可以在函数外执行它。这显然行不通。

所以我的结论是 b 函数 确实在 a 函数 的创建阶段被设置到内存中,但是一旦 a函数执行完毕,一旦弹出执行栈,b函数也会同时弹出内存

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

我说得对吗?

您通过谈论执行堆栈、创建阶段等不必要地使事情复杂化。

解释很简单:您不能调用 b,因为规范说明 b 超出了您尝试调用它的站点的范围。到此为止,故事结束。

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

如果您想在 a 之外调用 b,您需要在 a 之外创建对它的引用:

var myVar = 2;

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

var b = a();
b();

但这不会导致 b 打印全局 myVar。它仍然可以访问 a.

闭包范围内的 myVar