2012-03-20 13 views
7

Considerate questo codice:perché la creazione di istanze in linea si comporta diversamente?

function Foo() { 
} 

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

(new Foo()).alert(); 

Quando eseguito (in jsfiddle), l'avviso dimostra che 'questo' è l'oggetto finestra. Modifica dell'ultima riga su:

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

funziona come previsto.

Perché la differenza?

+0

jsFiddle demo. Sembra che il secondo 'alert' non venga eseguito: http://jsfiddle.net/sf3M3/ –

risposta

4

Sembra che vi manca un punto e virgola:

function Foo() { 
} 

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

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

Ecco un fiddle in cui sembra funzionare come previsto.

Che cosa realmente sta accadendo è che il metodo alert viene chiamato immediatamente, con una nuova istanza di Foo passato in esso, e alert viene quindi invitato il valore di ritorno (che è undefined):

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

Come @Nemoy ha menzionato, se usi semplicemente new Foo().alert() otterrai il comportamento previsto perché l'inserimento automatico del punto e virgola metterà un punto e virgola nel posto giusto per te (la mancanza di un punto e virgola non cambia il significato del codice). E poiché l'operatore new ha la precedenza più alta, le parentesi non sono obbligatorie.

6

Il codice è in realtà:

function Foo() { 
} 

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

A causa del punto e virgola mancante, aggiungere un punto e virgola e verrà eseguito correttamente.

+0

+1 Mi picchia. Questo è uno dei ** molti ** motivi per non fare affidamento sull'horror che è [inserimento automatico del punto e virgola] (http://es5.github.com/#x7.9). –

Problemi correlati