2012-01-20 5 views
4

別の言い方をすれば、セミコロンの挿入が失敗し、以下のコードが壊れてしまうのはなぜですか?セミコロンを放置するとこのコードが破損するのはなぜですか?

function Foo() { } 

Foo.prototype.bar = function() { 
    console.log("bar"); 
} // <------------ missing semicolon 

(function() { 
    Foo.prototype.la = function() { 
     console.log("la"); 
    }; 
})(); 

はなぜJavaScriptの解析エンジンは、私の閉鎖に何をFoo.prototype.bar = function() {を結合しようとしていますか?この閉鎖に入れることができるものはありますか?

私は、セミコロンを挿入するとセミコロンを挿入することを期待してセミコロンを省略することは推奨していません。私はちょうど私が誤ってオフを残したときに上記のコードが壊れた理由(もっと便利なバージョン)が不思議です。

答えて

3

だと思う...

Foo.prototype.bar = function() { // <-- 1. function 
    console.log("bar"); 
}(function() { // <-- 2. call the 1. function, passing a function argument 
    Foo.prototype.la = function() { 
     console.log("la"); 
    }; 
})(); // <-- 3. tries to invoke the return value of the 1. function, 
     //   but "undefined" was returned. 

私は生命維持のための()を使用して好きではない。私は他の演算子を好む。

Foo.prototype.bar = function() { 
    console.log("bar"); 
} 

void function() { 
    Foo.prototype.la = function() { 
     console.log("la"); 
    }; 
}(); 

元に戻り、最初の関数が関数を返すと、その関数が呼び出されたことがわかります。割り当てに使用されます

Foo.prototype.bar = function() { // <-- 1. function 

    console.log("bar"); 
    return function() { alert('INVOKED'); }; // 2. return a function 

}(function() { // <-- 3. call the 1. function, passing a function argument 
    Foo.prototype.la = function() { 
     console.log("la"); 
    }; 
})(); // <-- 4. tries to invoke the return value of the 1. function, 
     //   which will now call the returned function with the "alert()" 
@Lasse Reichsteinにより示唆されるように、まだその左と右のオペランドを評価する二項演算子として、単項演算子を使用し、結果を返すために更新

、。

+1

しかし、今ではbarにはその関数ではなく、その関数の結果がその括弧内にあるものと一緒に割り当てられます。ありがとうございました –

+0

HEH - 私は正直言って私が 'function()'を好む唯一の人だと思っていました...それをした他の唯一の人はminiferです:) –

+0

@AdamRackis:そこにはいくつかの人がいます。 :)あまりにも多くの文字が心配していなければ、私は実際に 'void'を好む。もっと目立つようだ。 –

4

それが下の行に(見て、あなたがコール引数として以下の機能を使用して(上記)にしたい意味するためにそれを取るためです。このようなことの

+0

*よく言われて、ありがとうございました。 –