2017-02-24 6 views
1

PluralSight Tutorialを読んでいるうちに、構文エラーが前の行の実行を妨げると主張されました。 2();および2 = 3;を例として示した。このReferenceErrorは、このTypeErrorが実行されないときにすべての実行を妨げるのはなぜですか?

しかし、Chromeのコンソールでこの動作をテストすると、2 = 3;だけが実行できなくなりました。ここで

は(私はShiftキー+を入力します使用しています)2();用の出力です:あなたが見ることができるように

console.log("foo 1"); 
2(); 
console.log("foo 2"); 
VM224:1 foo 1 
VM224:2 Uncaught TypeError: 2 is not a function 
    at <anonymous>:2:2 

そして、ここでは2 = 3;

console.log("foo 1"); 
2 = 3; 
console.log("foo 2"); 
VM202:2 Uncaught ReferenceError: Invalid left-hand side in assignment 

のためであるが、最初の行が実行されます2();foo 1の場合は印刷されます。しかし、2 = 3;の場合、何も印刷されません。

なぜ、以前のコードの印刷と実行を妨げる1つのタイプのエラーですが、もう1つはブラウザの依存性ですか?

答えて

4

これはReferenceErrorの性質によるものです。 an answer of mine

構文とセマンティクスをよりよく理解し、なぜこれがReferenceErrorをスローするのかを知りたい場合は、ECMAScript® 2015 Language Specificationを調べることができます。

Section 12.14.1 - Assignment Operators - 静的意味:仕様毎の早期エラー

AssignmentExpression : LeftHandSideExpression = AssignmentExpression

LeftHandSideExpressionがある場合には、早期の参照エラーでもないObjectLiteralArrayLiteralおよびIsValidSimpleAssignmentTargetLeftHandSideExpressionはfalseです。 IsValidSimpleAssignmentTargetがある

Section 12.14.3 - Assignment Operators - 静的意味:

AssignmentExpression : 
    YieldExpression 
    ArrowFunction 
    LeftHandSideExpression = AssignmentExpression 
    LeftHandSideExpression AssignmentOperator AssignmentExpression 

1.リターン偽IsValidSimpleAssignmentTarget

。割り当てが AssignmentExpression : LeftHandSideExpression = AssignmentExpressionしかし LeftHandSideExpression無効であるの定義に準拠している場合

あなたが見ることができるように、「早期のエラーが」発生します。2ObjectLiteralArrayLiteral、およびIsValidSimpleAssignmentTarget falseを返していないので、割り当ては失敗し、ReferenceErrorがスローされます。

ここで、「初期エラー」という用語を定義します。仕様あたり:

Section 16 - Errors

[...] 初期誤差前エラーを含むProgramにおける任意の構築物の評価に検出して報告することができるエラーです。

これは、初期のエラーが発生したときに実行されるコードはありません。あなたの割り当てでは、早いReferenceErrorが発生するため、コードは実行されないので、コンソールには決してログが記録されません。

第2の例では、function callが実行されます。 IsCallable(func)の結果が偽(funcNumber)であり、TypeErrorがスローされるため、評価のステップ5はTypeErrorをスローします。 TypeErrorではなく、であることに注意してください。したがって、コードの実行が行われ、コンソールがログに記録されます。行2();に遭遇すると、それが評価され、TypeErrorがスローされます。

ではなくです。すべてのブラウザとJavaScriptエンジンが仕様に準拠している必要があります。これは、すべてのエンジンで完全に実装されていないECMAScript®(AKA ES6)仕様から取得されたものです。すべての最新のエンジンが完全に実装されているECMAScript® 2011(ES5)仕様を参照することをおすすめしますが、上記の定義は両方のバージョンで変更されていません。


これらは構文エラーではありません。 Numberタイプが呼び出し可能でないため、2();TypeErrorです。 2 = 3は、2が割り当てられる無効な左手側であるため、ReferenceErrorです。ただし、数字である名前に関数を割り当てるのは構文エラーです。 function declarationの構文に違反してfunction 2() {}を実行します。宣言にはidentifierという名前が必要です。

数字が定数の場合、定数は定数なので何も割り当てできません。 2 = 3は現実世界では意味をなさないので、仕様書では禁止されています。同様に、あなたはvar 2 = function() {}を行うことはできません。

関連する問題