2011-12-24 14 views
5

¿cuál es la diferencia entre los navegadores y el nodo? por ejemplo:¿cuál es la diferencia entre los navegadores y el nodo?

setName.js en el nodo:

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

setName.html en el navegador:

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

el segundo registro es diferente, ¿por qué?

+0

es realmente "indefinido", mi versión nodo es 'v0.4.10' – island205

+3

(1) Tratamos de evitar las variables globales en el navegador. (2) Desea comenzar a escribir código de modo estricto, en cuyo caso el código anterior arroja ... –

Respuesta

7

Node es un motor de JavaScript, no un navegador. ¿El motivo específico por el que ve undefined en el nodo y Lulu en un navegador? Differences in the global namespace:

En los navegadores, el alcance de nivel superior es el alcance global. Eso significa que en los navegadores, si se encuentra en el alcance global, var something definirá una variable global. En Nodo esto es diferente. El alcance de nivel superior no es el alcance global; var something dentro de un módulo de nodo será local para ese módulo.

En el navegador, this es una referencia al objeto window - espacio de nombres global del navegador - para todas las funciones que se invocan sin ataduras a un objeto (por ejemplo, no como foo.bar()). En el nodo, this simplemente no es una referencia al espacio de nombres global.


N.B.console.log(this.name) en un intérprete de nodo imprimirá Lulu, no undefined. Eso es porque, en sólo el REPL,

> this === global 
true 

Lectura adicional @How To Node: What is "this?"


bien, una más edición que se requiere para @Šime Vidas' comentario con respecto a this en ES5 strict mode:

  • En el contexto global (fuera de cualquier función), this se refiere al objeto global, ya sea en modo estricto o no.
  • Cuando la palabra clave this se produce dentro de una función, su valor depende de how the function is called.
  • Cuando se llama a una función como método de un objeto, su this se establece en el objeto al que se llama el método.

Más interesante lectura de cortesía Juriy Zaytsev (aka @kangax) en one of his blog posts.

+3

Considere hacer que su respuesta esté más orientada al futuro agregando información sobre el modo estricto. (En cuerpos funcionales, 'this' no está definido a menos que se establezca explícitamente mediante el método de invocación). –

+0

tiene razón, ¡pero solo en REPL! – island205

+0

@ Šime ¿cómo es eso? –

2

Su código de navegador tiene el objeto de host window. El nodo no tiene ese objeto host.Cuando configura this.name, en realidad lo está configurando en el objeto window también conocido como variable global.

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

Cuestiones relacionadas