我有以下代码:
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函数引用。
返回声明似乎有奇怪的规则,我想澄清一下。谢谢你的时间。
答案 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)