2011-11-29 6 views
5

Estaba leyendo "JavaScript Module Pattern: In-Depth" de Ben Cherry, y tenía un código de ejemplo que no entendí del todo. Bajo el cruzada del archivo privado encabezado Estado, hay un código de ejemplo que tiene la siguiente:¿Por qué asignar esta variable a sí mismo en esta declaración var?

var _private = my._private = my._private || {} 

Esto no parece ser diferente de escribir algo como esto:

var _private = my._private || {} 

Lo que es pasando aquí y ¿cómo son estas dos declaraciones diferentes?

+0

Obviamente, falta un contexto, pero el segundo ejemplo no establece 'my._private' ...: -? –

+0

@ ÁlvaroG.Vicario tienes razón en que el segundo ejemplo no es el mismo que el primero. – jcolebrand

Respuesta

7
var _private = my._private = my._private || {} 

Esta línea significa utilizar my._private si es que existe, de lo contrario crear un nuevo objeto y ponerlo a my._private.

Se puede usar más de una expresión de asignación en una instrucción. El operador de asignación usa (consume) lo que está a la derecha y produce ese valor como su salida a la izquierda de la variable que se está asignando. Por lo tanto, en este caso, con paréntesis, para mayor claridad, lo anterior es equivalente a var _private = (my._private = (my._private || {}))

Este caso es un tipo de lazy initialization. Una versión menos concisa sería:

if (!my._private) { 
    my._private = {}; 
} 
var _private = my._private; 

En este caso, parece que la inicialización perezosa es más utilizado para la inicialización en cualquier lugar de la pereza. En otras palabras, todas las funciones pueden incluir esta línea para crear o usar de manera segura my._private sin soplar la var.

+0

De hecho. Y vencerme a la edición, porque sabía lo que querías decir ;-) – jcolebrand

+0

@jcolebrand Tuve que copiar mi edición de Programmers porque se migró mientras editaba :) – Nicole

+0

oh eso es una mierda: \ – jcolebrand

Cuestiones relacionadas