将'过程'(如果这不是已接受的定义)定义为没有返回值的函数/'子例程'(所以它是未定义的,我猜),例如:
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
,会不会有任何不同?
答案 0 :(得分:1)
当功能 a
正在执行并遇到return foo()
时,会发生以下情况:
a
foo
创建新的执行上下文foo
应该在新的执行上下文中执行foo
本身不包含任何return
语句,因此,该函数将运行完成(假设没有错误)。foo
的执行上下文,并且将取消引用所有局部变量(假设没有阻止此操作的闭包)。a
,在此处停止(return foo()
)foo
未返回值, function a
执行其return
语句但值为{ {1}}被返回 function undefined
的调用者。a
的执行上下文从调用堆栈中删除,并且所有局部变量都被取消引用(假设没有闭包阻止它)。行
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
。