JavaScriptのセミコロン補完問題

2202 ワード

JavaScriptでは、ステートメントがセミコロンで終わる.セミコロンを省略すると、ECMAScriptの仕様に従って文末を決定します.ECMAScript仕様の説明では、下記のような語句に対して、セミコロンがないと、解像器は自動的にセミコロンを適当な位置に追加します.
  • 空文
  • 変数文
  • 表現文
  • do-while文
  • contingue文
  • break文
  • return文
  • throw文
  • セミコロンに自動的に追加されるルールは以下の3つです.
    一、解析器はファイルの最後に当たります.
    二、解析器は語法に合わない記号(token)に出会い、また(a)この記号と前の記号との間に改行がある.あるいは(b)この記号は}です.
    三、コンフリクトは下記の5種類のresticted productionsに出会います.そして後ろに改行があります.
  • 接尾辞式+と--
  • contingue文
  • break文
  • return文
  • throw文
  • 第一条規則で発生しやすい問題は、ツールを使ってJavaScriptファイルをマージする場合、二つのファイルは正しいですが、最初のファイルの最後の行には行末番号と改行がありません.マージした後に、第二のファイルの先頭行と連結され、マージされたファイルは間違っています.
    第二条規則が発生しやすい問題は、後のコードと前のコードを合わせて文法にも適合する場合、例えば:
    var fun = function(){
    
      return function() {
    
        console.log("1");
    
      }
    
    }
    
    
    
    (function(){
    
      console.log('2');
    
    })()
    
    
    このとき、前のコードの後ろには自動的にセミコロンが追加されなくなり、2つの部分がつながってしまいます.出力の結果は1で、2ではありません.一般的に、行頭に注意すべきです. (、[、+、-、および/の5つの記号は、上のコードと接続されている可能性がありますので、エラーが発生します.
    第三条ルールにありがちな問題は、return後に改行するときにあります.例えば、
    function() {
    
      return
    
      {
    
         i: 1,
    
         j: 2
    
      };
    
    }
    
    
    このとき、リターンの後には、オブジェクトではなく、undefinedの戻り値が自動的に付加されます.
    自動的にセミコロンを追加する具体的なルールはECMAScript仕様を見ることができます.
    参考資料:[1]  ECMAScript 5.1 Language Specification-啣Automatic Semicolon Insertion[2]  Javascriptの10の設計欠陥-阮一峰のネット日記[3]  JavaScript文の後にセミコロンを付けますか?haxの技術ブログ-ITeE技術サイト[4]  JavaScript Semicolon Insertion[5]  Dealing with JavaScript's Automatic Semicolon Insertion[6]  Expressitions versus statements in JavaScript