在 Javascript 中返回过程时会发生什么?

What happens when returning a procedure in Javascript?

定义一个 'procedure'(如果这还不是公认的定义)作为一个函数/'subroutine' 没有 return 值(所以它是未定义的,我猜),这样如:

function foo() {
    console.log('something');
}

发生这样的事情:

function a() {
    if (somecondition) {
        return foo();
    }
    // more statements, but no return statement
}
a();

据我所知,写这篇文章的人只是不想使用 else 而是使用 returning 从函数中阻止其余部分的事实执行。这是正确的吗?有首选做法吗?

return foo() 只是 foo(); return; 的语法糖,因为 return foo(); == return undefined; == return;?这是一种不好的做法吗,因为还不清楚 foo() 的值是 undefined?

在非常低的水平上,return 值 undefined 会发生什么? a() 只会评估为 undefined 然后作为未分配的值存在于父级或全局范围的堆栈帧中,对吗?然后它很快就会被垃圾收集?

如果函数 a return 编辑了一个非未定义的值,比如 2,这会有什么不同吗?

function a正在执行并遇到return foo()时,会发生以下情况:

  1. 函数 a 应该暂停
  2. 应在执行堆栈
  3. 的顶部为函数 foo 创建一个新的执行上下文
  4. function foo 应该在那个新的执行上下文中执行
  5. function foo, 本身不包含任何 return 语句,因此,函数将 运行 完成(假设有没有错误)。
  6. foo 的执行上下文将从调用堆栈中删除,所有局部变量都将被取消引用(假设没有闭包阻止此操作)。
  7. 执行控制将 return 到 函数 a 它停止的地方 (return foo())
  8. 因为 function foo 没有 return 一个值,function a 执行它的return 语句,但值 undefined 被 returned 给 function a.
  9. 的调用者
  10. function a 的执行上下文从调用堆栈中删除,并且它的所有局部变量都被取消引用(假设没有闭包阻止它) .

Is the line return foo() just syntactic sugar for foo(); return;, since return foo(); == return undefined; == return;? Is this a bad practice, because it isn't exactly clear that the value of foo() is undefined?

Would return foo() (when foo() returns undefined) 会等于:foo(); return;,但这并不意味着这个语法是"syntactic sugar",这是一种不正确的语法,它暗示代码在做一件事,而实际上它在做另一件事。这种编码风格应该被使用。请记住,在所有编程中,最佳实践是 "make code readable"。这种语法,当大多数人阅读它时,会让我们立即相信代码被破坏了,因为它暗示你想做一些它显然不会做的事情(return 一个值给调用者)。

注意:所有取消引用的标识符都可立即用于垃圾回收,因为它们没有被分配到任何地方。

总结: 函数不接受它的 return 值的值,该值只是传递给调用者,由调用者确定怎么办。

即使 foo 做了 return 一个值,你的代码是:

a();

它不会捕获来自 a() 的 return 值,因此该值将立即被垃圾回收,因为它没有存储在任何地方。

但是,如果您写了:

var x = a();

然后 undefined 值将在 x 变量中持续存在,只要 x 仍在范围内。

在函数中使用 return 的唯一原因是尽早终止函数(return 本身会这样做)或终止执行但在传递 "output" 调用者的各种参数。如果您有一个纯粹过程性的函数(即,它确实起作用但不产生值结果),则没有理由包含 return。事实上,不鼓励不必要地使用 return,因为它会使代码更难阅读,并且由于对代码意图的误解而引入错误的可能性。

有时,你会看到

return foo();

但它是

的短文
foo();
return;

如果 foo 没有 return 某些东西,那么两个版本都有效,但只有第一个 return 来自 foo 的值,第二个 returns 默认值 undefined.