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()