以下是我想要启发的例子(某些事实并非如此)。
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函数)是不可能的。
我是对的吗?
答案 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
。