在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
分支中使用可选的花括号,因为它会在以后引发错误