2011-12-24 13 views
5

qual è la differenza tra browser e nodo? per esempio:qual è la differenza tra browser e nodo?

setName.js sul nodo:

var setName; 
setName = function (name) { 
    return this.name = name; 
}; 
setName("LuLu"); 
//LuLu 
console.log(name); 
//undefined 
console.log(this.name); 

setName.html in del browser:

<script> 
    var setName; 
    setName = function (name) { 
     return this.name = name; 
    }; 
    setName("LuLu"); 
    //LuLu 
    console.log(name); 
    //LuLu 
    console.log(this.name); 
</script> 

il secondo registro è diverso, perché?

+0

è davvero "indefinito", la mia versione nodo è 'v0.4.10' – island205

+3

(1) Noi cerchiamo di evitare di variabili globali nel browser. (2) Si desidera iniziare a scrivere codice in modalità rigorosa, nel qual caso il codice di cui sopra getta ... –

risposta

7

Il nodo è un motore JavaScript e non un browser. La ragione specifica per cui vedi undefined nel nodo e Lulu in un browser? Differences in the global namespace:

Nei browser, l'ambito di livello superiore è l'ambito globale. Ciò significa che nei browser se si è nell'ambito globale var something verrà definita una variabile globale. Nel nodo questo è diverso. L'ambito principale non è l'ambito globale; var something all'interno di un modulo nodo sarà locale a quel modulo.

Nel browser, this è un riferimento all'oggetto window - namespace globale del browser - per tutte le funzioni che vengono invocate distaccato da un oggetto (ad esempio non come foo.bar()). Nel nodo, this non è semplicemente un riferimento allo spazio dei nomi globale.


N.B.console.log(this.name) in un interprete Node stamperà Lulu, non undefined. Questo perché, solo nel REPL,

> this === global 
true 

Ulteriore lettura @How To Node: What is "this?"


Va bene, ancora una modifica, come richiesto dal @Šime Vidas' commento per quanto riguarda this in ES5 strict mode:

  • Nel contesto globale (al di fuori di qualsiasi funzione), this fa riferimento all'oggetto globale, sia in modalità rigorosa che non.
  • Quando la parola chiave this si verifica all'interno di una funzione, il suo valore dipende da how the function is called.
  • Quando una funzione viene chiamata come metodo di un oggetto, il suo this viene impostato sull'oggetto in cui viene richiamato il metodo.

Più interessante lettura per gentile concessione di Juriy Zaytsev (aka @kangax) in one of his blog posts.

+3

Considera di rendere la tua risposta più orientata al futuro aggiungendo informazioni sulla modalità rigorosa. (Nei corpi delle funzioni, 'this' non è definito a meno che non sia impostato esplicitamente dal metodo di chiamata.) –

+0

hai ragione, ma solo in REPL! – island205

+0

@ Šime come va? –

2

Il codice del browser ha l'oggetto host window. Il nodo non ha quell'oggetto host.Quando si imposta this.name, lo si sta effettivamente impostando sull'oggetto window noto anche come variabile globale globale.

window.name === this.name // true

Problemi correlati