Javascript - 返回语句被误解

标签 javascript function return

我有以下代码:

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/

相关文章:

c - 函数接收字符数组作为参数并返回字符数组

javascript - JQuery - 用于存储 javascript 使用的数据的最优雅的方式

javascript - 如何将 Javascript 映射函数与对象文字一起使用?

Javascript:允许作为参数传递的对象方法访问公共(public)方法

java - 将函数输出保存到 Firebase 和 Android 的变量

ios - TableView :viewForHeaderInSection: default value?

javascript - 将属性的 JSON 字符串解析为多个发送到同一端点

javascript - 动画网站缩放/缩放

javascript - block 作用域函数 ECMAScript 6 奇怪的行为

java - 从存储库返回实体时如何使用 CompletableFuture.thenCompose() ?