JavaScript中使用return关键字是否会产生预期的行为?

3
今天因为一个愚蠢的错误差点把自己的头发都拔光了。问题是我不知道这是否是期望的行为。
由于我习惯使用C#,我编写了以下javascript代码,尝试理解出现的问题,因为它没有返回任何内容,甚至没有将任何错误写入控制台:
this.fullName = ko.computed(function () {

    return
        this.firstName() + " " + this.lastName();

}, this);

半个小时后,我修改了以下代码,然后它就可以工作了:

this.fullName = ko.computed(function () {

    return this.firstName() + " " + this.lastName();

}, this);

这是预期的行为吗?
5个回答

10
是的。这是隐式分号。
这里有一个类似的情况,并附有解释:http://premii.com/lab/js_implicit_semicolon_and_return.php 简而言之:你的第一个片段被解释为:
this.fullName = ko.computed(function () {
    return;
    this.firstName() + " " + this.lastName();
}, this);

又一个证明JavaScript不是C#而且它是一个非常混乱的语言。谢谢! - tugberk

4

是的,ECMA规范,也就是JavaScript规范,定义了这样的行为

某些ECMAScript语句(空语句、...返回语句和抛出语句)必须以分号结尾。这样的分号可以始终明确地出现在源文本中。然而,为了方便起见,在某些情况下,这样的分号可以省略。这些情况是通过说在这些情况下自动插入分号来描述的。

此外

当遇到continue、break、return或throw标记并且在下一个标记之前遇到LineTerminator时,在continue、break、return或throw标记后面自动插入分号

返回或抛出语句中的表达式应该与返回或抛出标记位于同一行。

他们还给出了一个例子

源代码

return
a + b

自动分号插入将其转换为以下内容:
return;
a + b;

所以你的第一行代码将被解释为:

return;
        this.firstName() + " " + this.lastName();

在return语句末尾自动添加分号。

因此,该规范为在一般的JavaScript中应对这些情况提供了实用建议:

后缀++--运算符应出现在其操作数的同一行。

returnthrow语句中的表达式应从与return或throw标记相同的行开始。

breakcontinue语句中的标识符应与break或continue标记位于同一行。


我真的不知道是谁提出了分号可以省略的想法,但对我来说很明显他在那时候是高着呢。 - tugberk

1

是的,它不需要在行末加分号来结束语句。在这种情况下,它只是返回结果。


0

没错,JavaScript 中的分号通常是可选的,因此仅使用分号无法确定完整语句。不过,推荐一本很棒的 JavaScript 资源书,Douglas Crockford 的 JavaScript 语言精粹。


0
Javascript有一个特性,即自动分号插入,这并不好,您不应该依赖它,在语句结束时应添加分号。
在您的情况下,Javascript会在return语句中添加;,因此与以下语句相同:
return;
this.firstName() + " " + this.lastName();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接