-6

次のJavaScriptコードがあります

var foo = function () {
   var func = function () {
        var one = 0;
        if (one === 0) {
            alert('func');
        }

    }

    return {
        func: func
    };
}

foo = new foo();
foo.func();

私の上記のコードfuncは問題ありません。今、オブジェクトリテラルreturn {}を次のように変更すると

return
{
    func: func
}

その後、何も返されません。;JavaScriptが return の最後にセミコロンを追加するため、その理由がわかりました。この部分はしばらく置いておいて、元のコードに戻りましょう。ifステートメントを次のように変更すると

if (one === 0)
{
    alert('func');
}

次に、 alert を実行しfuncます。なぜ?. この場合、javascript の末尾にもセミコロンを追加する必要があるif(one === 0)ため、エラーが返されるはずです。

ちょっと待って、まだあります。ここで、一番上の元のコードに注意を戻しましょう。ここで、内部関数を次のように変更すると

var func = function ()
{
    //code here
}

次に、このコードを正常に実行し、アラートを出しfuncます。またなぜ?同じことが外部関数にも当てはまります。

4

1 に答える 1

2

いいえ、行末にセミコロンは挿入されません。ルールはもっと複雑です:

プログラムが左から右に解析されるときに、文法のどの生成でも許可されていないトークン (問題のトークンと呼ばれる) が検出されると、次の 1 つ以上の場合、問題のトークンの前にセミコロンが自動的に挿入されます。条件は真です:

  1. 問題のあるトークンは、少なくとも 1 つの LineTerminator によって前のトークンから分離されています。

  2. 問題のあるトークンは } です。

プログラムが左から右に解析されるときに、トークンの入力ストリームの最後が検出され、パーサーが入力トークン ストリームを単一の完全な ECMAScript プログラムとして解析できない場合、セミコロンが末尾に自動的に挿入されます。入力ストリーム。プログラムが左から右に解析されるときに、文法の一部の生成によって許可されているトークンが検出されたが、生成が制限された生成であり、トークンが注釈の直後の終端または非終端の最初のトークンになる場合"[no LineTerminator here]" 制限されたプロダクション内 (したがって、そのようなトークンは制限されたトークンと呼ばれます) であり、制限されたトークンは少なくとも 1 つの LineTerminator によって前のトークンから分離されています。制限されたトークンの前にセミコロンが自動的に挿入されます。ただし、上記の規則には追加のオーバーライド条件があります。セミコロンが空のステートメントとして解析される場合、またはそのセミコロンが for ステートメントのヘッダーにある 2 つのセミコロンの 1 つになる場合、セミコロンは自動的に挿入されません (セクション12.6.3)。

ECMAScript 仕様では、次の推奨事項が示されています。

その結果、ECMAScript プログラマーへの実際的なアドバイスは次のようになります。

後置 ++ または -- 演算子は、そのオペランドと同じ行に表示する必要があります。

return または throw ステートメントの Expression は、return または throw トークンと同じ行から開始する必要があります。

break または continue ステートメントのラベルは、break または continue トークンと同じ行にある必要があります。

しかし、実際に覚えておくべきことは、これが複雑であることです。そのため、セミコロンを自分で追加してください。バグを求めないでください。

于 2013-04-02T17:48:51.037 に答える