在 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()
时,会发生以下情况:
- 函数
a
应该暂停
- 应在执行堆栈
的顶部为函数 foo
创建一个新的执行上下文
- function
foo
应该在那个新的执行上下文中执行
- function
foo
, 本身不包含任何 return
语句,因此,函数将 运行 完成(假设有没有错误)。
foo
的执行上下文将从调用堆栈中删除,所有局部变量都将被取消引用(假设没有闭包阻止此操作)。
- 执行控制将 return 到 函数
a
它停止的地方 (return foo()
)
- 因为 function
foo
没有 return 一个值,function a
执行它的return
语句,但值 undefined
被 returned 给 function a
. 的调用者
- 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
.
定义一个 '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()
时,会发生以下情况:
- 函数
a
应该暂停 - 应在执行堆栈 的顶部为函数
- function
foo
应该在那个新的执行上下文中执行 - function
foo
, 本身不包含任何return
语句,因此,函数将 运行 完成(假设有没有错误)。 foo
的执行上下文将从调用堆栈中删除,所有局部变量都将被取消引用(假设没有闭包阻止此操作)。- 执行控制将 return 到 函数
a
它停止的地方 (return foo()
) - 因为 function
foo
没有 return 一个值,functiona
执行它的return
语句,但值undefined
被 returned 给 functiona
. 的调用者
- function
a
的执行上下文从调用堆栈中删除,并且它的所有局部变量都被取消引用(假设没有闭包阻止它) .
foo
创建一个新的执行上下文
Is the line
return foo()
just syntactic sugar forfoo(); return;
, since returnfoo(); == 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
.