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

在Javascript中返回过程时会发生什么?,javascript,function,return,procedure,Javascript,Function,Return,Procedure,将“过程”(如果这还不是公认的定义)定义为没有返回值的函数/“子例程”(因此我猜它是未定义的),例如: function foo() { console.log('something'); } 在这种情况下会发生什么: function a() { if (somecondition) { return foo(); } // more statements, but no return statement } a(); 据我所知,编写这篇文章

将“过程”(如果这还不是公认的定义)定义为没有返回值的函数/“子例程”(因此我猜它是未定义的),例如:

function foo() {
    console.log('something');
}
在这种情况下会发生什么:

function a() {
    if (somecondition) {
        return foo();
    }
    // more statements, but no return statement
}
a();
据我所知,编写这篇文章的人只是不想使用
else
,而是使用了一个事实,即从函数返回会阻止其余部分被执行。是这样吗?有没有更好的做法

returnfoo()
只是
foo()的语法糖;返回,因为
返回foo()=
返回未定义=
返回?这是一种不好的做法吗,因为不清楚
foo()
的值是否为
未定义的

在非常低的级别上,返回值
未定义会发生什么变化
a()
将计算为
undefined
,然后作为未赋值值存在于父范围或全局范围的堆栈框架中,对吗?然后很快就会被垃圾收集起来

如果函数
a
返回一个未定义的值,如
2

当函数
a
执行并遇到
return foo()
时,会发生以下情况:

  • 应暂停功能
    a
  • 应在执行堆栈顶部为函数
    foo
    创建新的执行上下文
  • 函数
    foo
    应该在新的执行上下文中执行
  • 函数
    foo
    本身不包含任何
    return
    语句,因此,函数将运行到完成(假设没有错误)
  • foo
    的执行上下文将从调用堆栈中删除,所有局部变量都将被取消引用(假设没有阻止此操作的闭包)
  • 执行控制将返回到它停止的函数
    a
    returnfoo()
  • 由于函数
    foo
    没有返回值,因此函数
    a
    执行其
    return
    语句,但将
    未定义的
    值返回给函数
    a
    的调用者
  • 函数
    a
    的执行上下文将从调用堆栈中删除,其所有局部变量都将被取消引用(假设没有阻止它的闭包)
  • returnfoo()
    只是
    foo()的语法糖;返回,,
    因为返回
    foo();==返回未定义;==返回?这是坏消息吗
    练习,因为foo()的值是否为
    未定义

    返回foo()
    (当
    foo()
    返回
    未定义的
    时)将等于:
    foo();返回,但这并不意味着这种语法是“语法糖”,而是不正确的语法意味着代码在做一件事,而实际上它在做其他事情。不应使用此编码样式。记住,在所有编程中,最佳实践是“使代码可读”。这种语法,当大多数人阅读它时,会让我们立即相信代码被破坏了,因为它意味着你想做一些它显然不想做的事情(向调用者返回一个值)

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

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

    即使
    foo
    返回了一个值,您的代码是:

    a();
    
    它不会捕获来自
    a()
    的返回值,因此该值会立即被垃圾收集,因为它不会存储在任何位置

    但是,如果您写过:

    var x = a();
    
    然后,
    undefined
    值将在
    x
    变量中保持,只要
    x
    仍在范围内

    在函数中使用
    return
    的唯一原因是提前终止函数(一个
    return
    本身就可以这样做),或者终止执行,但在将排序的“输出”参数传递给调用方时执行。如果您有一个纯过程性的函数(即,它可以工作但不产生值结果),则没有理由包含
    返回
    。事实上,不鼓励不必要地使用
    return
    ,因为这会使代码更难阅读,并且由于对代码意图的误解而引入错误的可能性。

    有时,您会看到

    return foo();
    
    但这是一篇短文

    foo();
    return;
    

    如果
    foo
    没有返回任何内容,那么两个版本都可以工作,但只有第一个版本返回
    foo
    中的值,第二个版本返回默认值
    undefined

    我想你的意思是
    return foo
    不,我真的没有。也许标题应该改为“过程调用的结果”?我不知道你为什么这么想。“行
    return foo()
    只是
    foo();return
    ”那么就不是了,因为没有办法知道
    foo()
    的值在运行前是未定义的。为什么你需要知道
    foo()的值
    在运行时之前?但是假设
    foo
    是一个过程?在这种情况下,它们在功能上是等价的,不是吗?我在我的问题中认识到了所有这些点,问题更多的是关于低级发生了什么,以及它是否是语法上的糖分。我的意思是,
    //更多的语句,但是如果
    某些条件
    是虚假的,就不会返回到
    位。@sidney这是真的,但是您确实不应该在
    if/then/else
    分支中使用可选的花括号,因为它会在以后引发错误