2016-12-22 23 views
-1

次のコードは、これをなぜ がこのステートメントにセミコロンが必要なのはなぜですか?

if (4<5) console.log('hi') 
(4<5) ? console.log('hi') : console.log('bye') 

次のコードは、任意の誤り

if (4<5) console.log('hi') 
if (4<5) console.log('hi') 

を返さない「はconsole.log(...)は関数ではありません」というエラーを返します。そう?

+1

真理値の部分では、3項演算子を単独で放置することはできません。そこには、これが文法であることは不思議ではありません。 –

+0

私の悪い、ちょうど質問を更新しました。 – sawa

+1

更新されたコードでエラーメッセージが表示されない – Liam

答えて

5

最初の行の最後にセミコロンがない場合、コードは最初のconsole.logの戻り値を関数として使用し、引数4<5を呼び出します。あなたは改行を削除する場合、これは明確である:

if (4<5) console.log('hi')(4<5) ? console.log('hi') : console.log('bye') 
//  ^^^^^^^^^^^^^^^^^^^^^^---- looks like calling `console.log` and then 
//         using the result as a function 

これの可能性はあなたが表現して(あなたは誤り訂正mechansim に頼っていることを意味する)セミコロンをオフのまま組み合わせの任意の時間がありますステートメント。 expressionステートメントは、その性質上、式であるため、前の式またはステートメントでパーサーがそれらを使用できる場合は、式が使用されます。


FWIW、astexplorer.netは、私は最近、(バベルプロジェクトのおかげで)見つけたクールなツールです。これはインタラクティブな構文ツリーエクスプローラで、いくつかのパーサーのいずれかを使用してコードを解析し、正確にを教えてください。パーサーされました。 githubアカウントからは、私たち自身のFelix Klingによって開始されました。


Quoting Brendan Eich

ASIは、構文エラー訂正手順を(正式に言えば)されます。あたかも普遍的な重要な改行規則のようにコードを作成すると、困ったことになります。

+0

しかし、TJ、その場合、未定義関数はaptエラーでなければなりません。ではない? 'console.log()'は未定義を返します。 –

+1

@RajaprabhuAravindasamy:私の答えで引用したエラーは次のようなものです: 'console.log(...)'の結果は関数ではありません。 ( 'console.log'は関数ではありません。 –

関連する問題