2012-03-20 6 views
7

このコードを検討:インラインインスタンスの作成動作が異なるのはなぜですか?

function Foo() { 
} 

Foo.prototype.alert = function() { 
    alert(this); 
} 

(new Foo()).alert(); 

(jsfiddleで)実行されると、アラートが「これは」ウィンドウオブジェクトであることを示しています。最後の行を次のように変更します。

var foo = new Foo(); 
foo.alert(); 

期待どおりに動作します。

なぜ違いがありますか?

+0

jsFiddleデモ2番目の「アラート」が実行されないように見えます:http://jsfiddle.net/sf3M3/ –

答えて

4

あなたがセミコロンが欠落しているようだ:

function Foo() { 
} 

Foo.prototype.alert = function() { 
    alert(this); 
}; //Semi-colon here! 

(new Foo()).alert();​ 

はここで、あなたが期待通りに動作するために表示されるfiddleです。

実際に何が起こっていることはalert方法は、それに渡さFooの新しいインスタンスを、即座に呼び出されるということである、とalertは、(undefinedである)戻り値に呼び出されます。

Foo.prototype.alert = function() { 
    alert(this); 
}(new Foo()).alert(); 

として、あなたがちょうどnew Foo().alert()を使用している場合@ Nemoyが言及しました、自動セミコロンの挿入があなたのために適切な場所にセミコロンを置くので、期待された動作を得るでしょう(セミコロンの欠如はコード)。 new演算子の優先順位が最も高いため、かっこは必要ありません。

6

あなたのコードは実際には次のとおりですので、不足しているセミコロンの

function Foo() { 
} 

Foo.prototype.alert = function() { 
    alert(this); 
}(new Foo()).alert(); 

は、セミコロンを追加し、それが正しく実行されます。

+0

+1私をビートしてください。これは恐怖に頼らない**多くの**理由の1つです。[自動セミコロン挿入](http://es5.github.com/#x7.9)です。 –

関連する問題