这是JavaScript上的return关键字的预期行为

时间:2012-03-17 12:51:26

标签: javascript

我今天濒临把所有的头发拉到一个愚蠢的错误上。问题是我不确定这是否是预期的行为。

根据我对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 个答案:

答案 0 :(得分:10)

是。这是隐含的分号。

以下是与解释类似的情况:http://premii.com/lab/js_implicit_semicolon_and_return.php

简而言之:您的第一个片段被解释为:

this.fullName = ko.computed(function () {
    return;
    this.firstName() + " " + this.lastName();
}, this);

答案 1 :(得分:4)

ECMA Spec,这是Javascript规范,定义了这样的行为

  

必须终止某些ECMAScript语句(空语句,... return语句和throw语句)   用分号。这样的分号可能总是明确地出现在   源文本。 为方便起见,可以省略分号   在某些情况下从源文本。这些情况是   描述分号会自动插入   这些情况下的源代码令牌流。

更多

  

当遇到继续,中断,返回或抛出令牌时a   在下一个标记之前遇到LineTerminator,分号是   继续,中断,返回或抛出后自动插入   令牌。

     

表达式或抛出语句应该从同一个开始   line作为return或throw标记。

他们给出了示例

来源

return
a + b

通过自动分号插入转换为以下内容:

return;
a + b;

因此,您的第一个代码将被解释为:

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

在返回结束时自动添加半冒号。


因此规范提供了一般javascript中面对这些情况的实用建议:

  

后缀 ++ - 运算符应与其相同的行显示   操作数。

     

return throw 语句中的表达式应该以相同的方式开始   line作为return或throw标记。

     

中断继续语句中的标识符应该是相同的   作为中断或继续令牌的行。

答案 2 :(得分:1)

是的,确实如此。 Javascript在行尾不需要分号来结束语句。在这种情况下,它只是返回。

答案 3 :(得分:0)

是的,javascript中的分号往往是可选的,所以没有确切的方法来区分仅使用分号的完整语句。看看这本书,我听说它是​​JS的一个很好的资源,是douglas crockford的javascript的好部分。

答案 4 :(得分:0)

Javascript有一个自动分号插入的羽毛,这不好,你不应该依赖它并在语句结束时添加分号。

在您的情况下,javascript将;添加到return语句中。所以它与:

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