2016-03-14 59 views
4

我認爲我應該問關於jSHint的新問題,討論開始here,我現在可以看到來自JSHint的奇怪警告,我只是想知道爲什麼。JSHint奇怪的行爲

This services被建議。

所以我有這樣的代碼在JSHint:

var foo = function() { 
    return { 
     hi: console.log("foo") 
    } //line 15 <------ why we have to put ; here? 
}; 

var foo1 = function() { 
    return // i know about ; here, please read post 
    { 
     hi: console.log("foo1") 
    }; // line 22 <---- why we don't need to put ; here? 
}; 

標誌着我在那裏我得到通過評論「這一行」警告以上線路。

所以,問題:

我有兩個奇怪的警告:

首先警告15 Missing semicolon.約15線

二警告22 Unnecessary semicolon.約22線

但那些2線找我相同,我錯過了什麼?爲什麼我們在這裏有兩個不同的警告?

編輯

問題不是問題,問題是關於警告。他們爲什麼不同?

我知道我錯過了第二回報中的分號!

+0

第15行:您需要分號 –

+0

@ taj-ahmed hm,我在我的問題中有 – alexey

+0

您的返回語句沒有與您的行相同的分號22 –

回答

1

分號應該遵循陳述。他們不需要遵循區塊。例如,在這裏與if不必要的分號:

if(foo === bar) { 
    //... 
}; 

if塊將沒有必要的分號。

這是什麼都與你的情況怎麼辦?那麼,有時{ ... }是一個塊,有時{ ... }是一個對象文字。周圍的上下文讓語法決定它是哪一個。在你的第一個案例中,它是一個對象;在第二種情況下,這是一個塊。

以下在同一行一個return語句的字符被解析爲一個表達式。當{ ... }被解析爲一個表達式時,它是一個對象文字。在你的第一個例子中,return { ... }是一個帶有對象表達式的返回語句。它應該有一個終止分號,因爲它是一個聲明。

關鍵的一點需要明白的是,ECMAScript的語法不允許換行分隔return和返回值表達式。這是一個在ES2015 §11.9.1, Rules of Automatic Semicolon Insertion

ReturnStatement[Yield] :

  • return [no LineTerminator here] Expression;
  • return [no LineTerminator here] Expression[In, ?Yield];

一個ReturnStatement不能有return表達之間的LineTerminator字符。

既然你有一個換行符你return{ ... }之間的{ ... }部分沒有解析爲屬於return。它是獨立的,這意味着它被解析爲一個塊。所述{ ... }序列只能被解析爲當它是一個較大的語句或表達式的一部分的對象,像

  • 分配,foo = { ... }
  • 函數參數(bar({ ... }
  • 一個返回值(return { ... }

{ ... }本身純粹在一條線上,它被視爲一個塊。

由於第二殼體具有一個塊,而不是一個對象,它不需要分號,如在此答案的開頭描述。

+0

;第二次返回後,我們會看到這樣的警告:在控制檯語句上標記'hi'。 ,這是什麼意思? – alexey

+0

@alexey既然'{...}'這裏是一個blcok,'{hi:...}'中的'hi:'是一個[標籤](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/label):http://stackoverflow.com/q/31924988/710446。 JSHint可能只是警告你,你在無意義的上下文中使用了一個標籤 - 標籤只有在像'while'這樣的循環結構之前使用時纔有用。 – apsillers

+0

非常感謝!現在我認爲我有更多的理解:) – alexey

0

兩件事情,首先在這裏

return { 
     hi: console.log("foo") 
    } 

需要;指定對象的最終文本,並在這裏

return 
    { 
     hi: console.log("foo1") 
    }; 

,因爲你沒有把{return後,一個;它放在那裏爲你由js引擎(可選分號)。

+0

爲什麼我們在第二次返回時沒有放分號?爲什麼我們必須在第一次返回時使用分號? – alexey

+0

@alexey https://www.codecademy.com/blog/78 – Ramanlfc

+1

@alexey第一種情況下是由JS引擎讀作文字一個對象,而在第二情況下,它找到'return'並沒有什麼之後它在該行上,所以加上',',因此你的第二情況下最終被一個代碼塊 – Ramanlfc

2

您的第一個示例以您期望的方式運行。該函數將返回一個具有hi屬性的對象。 return語句包含一個可選表達式,並且必須以分號結尾(通過自動分號插入顯式或隱式)。默認情況下JSHint更喜歡顯式分號,因此指出你錯過了一個。

你的第二個例子沒有以你期望的方式運行。該功能將返回undefined。原因是解析器認爲return語句沒有跟隨一個表達式。這是因爲語法在允許自動分號插入時有些模糊。這個例子被解析爲一個空的return語句後跟一個塊。塊不需要以分號結束,因此JSHint指出第二個示例中使用的分號是不必要的。

+0

的問題是:爲什麼沒有錯誤在第19行_missing分號_這是一個return語句並沒有semecolon?那麼爲什麼沒有錯誤信息呢? – Qwertiy

+0

@Qwertiy - 啊,我明白了。如果我將有問題的代碼粘貼到http://jshint.com,我確實收到該行的「缺少分號」錯誤(以及「換行錯誤」)。 –

+0

關於我們19行另一個錯誤:'行分手錯誤'return',不知道爲什麼,但是好的。 我的問題是:'可選表達式'和'塊'有什麼區別? – alexey