2012-03-17 56 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

相關問題