2010-12-04 12 views
28

en JavaScript Dada esta función de tres constructor:'var' vs 'esto' vs variables de constructor con parámetro

function Foo(data) { 

    var _data = data; 

} 

function Bar(data) { 

    this.data = data; 

} 

function Baz(data) { 

    //just use data freely. 

} 

¿Hay alguna diferencia, aparte de la visibilidad del miembro data después de la construcción? (Por ejemplo, se puede hacer nueva Bar().data pero no new Foo().data)

Respuesta

25

var _data = data; crea una copia local (no de referencia) de data. this.data = data realmente crea una propiedad del objeto en sí.

recomiendo la lectura de este (sin doble sentido): http://javascriptweblog.wordpress.com/2010/08/30/understanding-javascripts-this/

+2

Nota: A la variable local se le asigna el valor del parámetro. Si el parámetro es una referencia a un objeto, la variable local también será una referencia al mismo objeto, no una referencia a una copia del objeto. – Guffa

+1

esta es una gran respuesta (juego de palabras) – Marty

27

Sí, la diferencia está en cómo se almacena la variable.

La variable declarada con var es local para la función de constructor. Solo sobrevivirá más allá de la llamada del constructor si hay alguna función declarada en el alcance, ya que luego se captura en el cierre de las funciones.

La variable declarada con this. no es en realidad una variable, sino una propiedad del objeto, y sobrevivirá tanto como lo haga el objeto, independientemente de si se usa o no.

Editar:
Si está utilizando variables sin declararlas, se declararán implícitamente en el ámbito global, y no serán parte del objeto. En general, debe tratar de limitar el alcance de lo que declara, para que no todo termine en el ámbito global.

+1

Si una variable nunca se usa ... ¿Importa si existe o no? –

+0

La variable sobrevivirá a la llamada al constructor incluso si no es utilizada por ningún método (siempre que exista al menos un método). Los métodos no tienen que usar la variable; sobrevive porque está atrapada en el alcance de los métodos. –

+0

@Pablo: No mucho, pero es un efecto de la diferencia entre las formas de declarar variables. – Guffa