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

时间:2017-01-11 06:34:42

标签: javascript function return procedure

将'过程'(如果这不是已接受的定义)定义为没有返回值的函数/'子例程'(所以它是未定义的,我猜),例如:

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

在这样的事情中会发生什么:

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

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

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

在非常低的水平,返回值a()会发生什么? undefined只会求值为a,然后作为未分配的值存在于父或全局作用域的堆栈帧中,对吧?之后很快就会收集垃圾?

如果函数2返回了一个非未定义的值,如dd_mm_yyyy,会不会有任何不同?

2 个答案:

答案 0 :(得分:1)

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

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

    a只是return foo()的语法糖,   从返回foo(); return;开始?这是不好的   练习,因为它并不完全清楚foo()的值是   未定义?

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

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

    摘要:函数不接受其返回值的值,该值只是传递给调用者,调用者可以决定如何处理它。

    即使foo(); return;确实返回了值,您的代码也是:

    foo

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

    但是,如果你写了:

    a()

    只要var x = a(); 保留在范围内,undefined值就会保留在x变量中。

    在一个函数中使用x的唯一原因是提前终止函数(一个return本身就会这样做)或者终止执行但是在传递一个"输出"对呼叫者进行排序的参数。如果你有一个纯粹是程序性的函数(也就是说它确实有效但不产生值结果),那么就没有理由包含return。实际上,不鼓励不必要地使用return,因为它使代码更难以阅读,并且由于对代码意图的误解而引入了错误的可能性。

答案 1 :(得分:0)

有时,你会看到

return foo();

但它只是简短的

写作
foo();
return;

如果foo没有返回内容,则两个版本都有效,但只有第一个返回foo的值,第二个返回默认值undefined