2012-03-17 58 views
3

我正处在一个愚蠢的错误中,将我所有的头发拉到了今天的边缘。问题是我不确定这是否是预期的行为。这是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); 

这是一个预期的行为?

回答

10

是的。这是隐含的分号。

这里有类似的情况解释:http://premii.com/lab/js_implicit_semicolon_and_return.php

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

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

好吧,另一个证明JavaScript不是C#,它是一个真正的“f”编辑语言。谢谢! – tugberk 2012-03-17 12:56:14

+0

使用CoffeeScript代替:) – 2012-03-17 13:04:17

1

是的,它是。 Javascript不需要分号结束语句。在这种情况下,它只是返回。

0

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

0

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

在你的情况下,javascript将;添加到return声明中。所以它是一样的:

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

ECMA Spec,这是JavaScript规范,定义这样

某些ECMAScript中陈述行为(空语句,...... return语句,扔声明)必须以分号结尾 。这些分号可能会始终显示在 源文本中。 为了方便,但是在某些情况下,这样的分号可以从源文本中省略 。这些情况是 所述,通过说分号自动将插入 这些情况下的源代码令牌流。

进一步

当继续,休息,返回,或者抛出令牌遇到并且遇到 LineTerminator的下一个标记之前,分号 后自动插入继续,突破,返回,或者抛出令牌 。

在返回或throw语句表达应该开始在同一 线返回或抛出令牌。

而且他们给出的示例

return 
a + b 

由自动分号插入变形为以下:

return; 
a + b; 

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

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

与回报的末尾自动添加分号。


因此,规范给出了切实可行的建议一般JavaScript来面对这些情况:

一个后缀++-运营商应该出现在同一行作为其 操作数。

回报声明应该开始在同一 线返回或抛出令牌的表达式。

一个标识符在休息继续的说法应该是在同一 线突破或继续令牌。

+1

+1规范:) – 2012-03-17 13:10:10

+0

我真的不知道是谁提出**分号的想法可能会被省略**,但对我而言显然他是高的,当他这样做时。 – tugberk 2012-03-17 13:14:55

相关问题