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
这是我想要启发的例子(实际上不起作用的东西)。
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