我有以下代码:
function a(){
b();
return undefined;
}
function b(){
c = function(){ };
return c;
}
a();
console.log(c); //Why can we see it?
我会或多或少地告诉你我是如何看待这个问题的,如果我错了,请纠正我:
第一个a正在执行,并且创建了一个新的执行上下文。 a执行处理的同时,也执行b函数,所以有 创建了一个新的执行上下文。
b 的执行上下文将 c(一个函数)返回到 a 的执行上下文。 现在b的执行上下文结束了,执行堆栈又回到了a, 它看到:“返回未定义”。
好吧,现在 a 的执行上下文将 undefined 返回给调用者。现在我不明白的是,c 函数如何仍然存在(您可以使用 console.log(c); 看到它),更重要的是,为什么它附加到 window 对象? 据我的理解(我知道这在某个地方是错误的)它应该被垃圾收集 一旦 a 的执行上下文结束,因为它保存了 c 的函数引用。
返回语句似乎有奇怪的规则,我想澄清一下。感谢您抽出时间。
最佳答案
这是因为您将 c
设置为全局变量(并且所有全局变量都位于浏览器上下文中的 window 对象上)。如果正确初始化它,您将不会在控制台中看到它:
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)
关于Javascript - 返回语句被误解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33812903/