Javascript-返回语句被误解
我有以下代码:Javascript-返回语句被误解,javascript,function,return,Javascript,Function,Return,我有以下代码: function a(){ b(); return undefined; } function b(){ c = function(){ }; return c; } a(); console.log(c); //Why can we see it? 我将或多或少地告诉你我是如何看待这一点的,请纠正我的错误: 首先是执行,并创建一个新的执行上下文。 当a的执行正在处理时,它也执行b函数,所以 创建了一个新的执行上下文 b的执行上下文将函数c返回
function a(){
b();
return undefined;
}
function b(){
c = function(){ };
return c;
}
a();
console.log(c); //Why can we see it?
我将或多或少地告诉你我是如何看待这一点的,请纠正我的错误:
首先是执行,并创建一个新的执行上下文。
当a的执行正在处理时,它也执行b函数,所以
创建了一个新的执行上下文
b的执行上下文将函数c返回给a的执行上下文。
现在b的执行上下文结束了,执行堆栈返回到a,
它看到:“返回未定义”
现在a的执行上下文正在将未定义的返回给调用方。现在我不明白的是,c函数是如何仍然存在的(您可以通过console.log(c);)看到它),更重要的是,为什么它要附加到窗口对象?
据我的理解(我知道这在某些地方是错误的),它应该被垃圾收集
一旦a的执行上下文结束,因为它持有c的函数引用
返回声明似乎有奇怪的规则,我想澄清一下。谢谢您的时间。这是因为您将
c
设置为全局变量(并且所有全局变量都位于浏览器上下文中的窗口对象上)。如果正确初始化,您将无法在控制台中看到它:
function a(){
b();
return undefined;
}
function b(){
var c = function(){ }; // var = local scope only
return c;
}
a();
console.log(c); // No longer can see it, undefined error as expected
更新/进一步解释 由于您的标题提到了return语句,我只想补充一点,这与函数返回无关,而只与变量声明有关。您的代码在没有任何返回语句的情况下表现相同,因为您没有使用函数返回值,例如:
console.log(b()); // will output the value of c,
// which is what function b returns
// and it doesn't matter if c is global or local
// (but try always to use local)
这是因为您将
c
设置为全局变量(并且所有全局变量都位于浏览器上下文中的窗口对象上)。如果正确初始化,您将无法在控制台中看到它:
function a(){
b();
return undefined;
}
function b(){
var c = function(){ }; // var = local scope only
return c;
}
a();
console.log(c); // No longer can see it, undefined error as expected
更新/进一步解释 由于您的标题提到了return语句,我只想补充一点,这与函数返回无关,而只与变量声明有关。您的代码在没有任何返回语句的情况下表现相同,因为您没有使用函数返回值,例如:
console.log(b()); // will output the value of c,
// which is what function b returns
// and it doesn't matter if c is global or local
// (but try always to use local)
您已经在全局范围上声明了
c
。它没有绑定到您在全局范围上声明的c
。它没有绑定到b()