2012-01-15 16 views
5

he navegado últimamente js código y la sintaxis siguiente se presenta de nuevo:Propósito de var a = b.c = function() {} sintaxis

var foo = bar.bi = function() {...} 

Ésta es la sintaxis desconocida para mí. ¿Es solo para definir dos nombres para la misma función? Si es así, ¿por qué no solo lo define como bar.bi = function()?

Respuesta

6

Asigna el mismo valor a la variable y la propiedad bi del objeto bar al mismo tiempo.

De esta manera, la propiedad del objeto obtiene el valor, pero aún así puede hacer referencia a ella como una variable, que probablemente sea un poco más rápida.

efectivamente el mismo que ...

bar.bi = function() {...}; 
var foo = bar.bi; 

foo === bar.bi; // true 

O puede visualizarla como ...

var foo = (bar.bi = function() {...}); 

Así que la asignación a bar.bi suceda primero. El resultado devuelto por la expresión de asignación es la misma función, y ese resultado se asigna al foo.

+1

+1 - Me ganaste :) –

1

Además de asignar la función a 2 variables, el contexto también cambia dependiendo de cómo lo llame.

bar.bi(); 

tendría su contexto como el objeto bar, como si se hubiera utilizado este:

foo.call(bar); 

Pero el uso fuera de la otra variable, como esto:

foo(); 

haría usa el contexto de foo. Así que si foo es en el contexto global, que será equivalente a esto:

bar.bi.call(window); 
+0

Un punto interesante, ¿se usa este comportamiento comúnmente? – Fdr

+0

@Fdr - No lo sé. Realmente no lo he visto en acción nunca, pero es bueno saberlo. –

1

Es sólo una asignación compuesta

var r = x = 3; 

asigna 3 a x, y también para r, que está recién declarada .

Su ejemplo simplemente sustituye una función en lugar de 3, y una propiedad del objeto- bar.bi -en lugar de x.

0

Depende de dónde se use.

Ambos foo y bar.bi apuntan a la misma función aquí. Eso significa que la función se puede recuperar usando

foo(); 

y

bar.bi(); 

Al mismo tiempo se diferencia en el valor de this dentro de la función.Para hacer que la primera uno igual a segundo uno, debe ser invocada como se indica a continuación

foo.call(bar); 

o

foo.apply(bar); 

Esto asegura que this apuntará a bar dentro de la función.

consulte:

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/call.

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/apply.

.

0
var foo = bar.bi = function() {...}; 



bar.bi === function() {...} //true 

foo === bar.bi //true 

barra será un objeto que responde al método bi.

+0

Creo que encontrará que sus primeras dos comparaciones '===' serán '// false' porque está comparando dos objetos de función diferentes. Tu último es, por supuesto, correcto. –

+1

Sí. Tienes razón. Gracias. – riship89

Cuestiones relacionadas