Javascript - 返回语句被误解

时间:2015-11-19 19:39:00

标签: 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(一个函数)返回给执行上下文。 现在b的执行上下文已经结束,执行堆栈又回来了, 并且它看到:"返回undefined"。

好吧,现在一个执行上下文将未定义的返回给调用者。现在我不明白,c函数是如何存在的(你可以用console.log(c);来看),更多的是,它为什么附加到window对象? 根据我的理解(我知道这是错误的)它应该被垃圾收集 一旦执行上下文结束,因为它保存了c函数引用。

返回声明似乎有奇怪的规则,我想澄清一下。谢谢你的时间。

1 个答案:

答案 0 :(得分:3)

这是因为你使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语句,我只想补充一点,与函数返回无关,但只有变量声明。您的代码在没有任何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)