2012-01-15 2 views
5

J'ai récemment parcouru de code et la syntaxe suivante revient sans cesse:Objet du var a = = function b.c() {} syntaxe

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

Cette syntaxe est peu familière pour moi. Est-ce seulement pour définir deux noms pour la même fonction? Si oui, pourquoi ne pas le définir comme bar.bi = function()?

Répondre

6

Affecte la même valeur à la variable et à la propriété bi de l'objet bar en même temps. De cette façon, la propriété de l'objet obtient la valeur, mais vous pouvez toujours la référencer comme une variable, ce qui est probablement un peu plus rapide.

efficacement la même chose que ...

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

foo === bar.bi; // true 

Ou vous pouvez le visualiser comme ...

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

Ainsi, l'affectation à bar.bi arrive en premier. Le résultat renvoyé à partir de l'expression d'affectation est la même fonction et ce résultat est affecté à foo.

+1

+1 - Vous me battez :) –

1

En plus d'affecter la fonction à 2 variables, le contexte change également en fonction de la façon dont vous l'appelez.

bar.bi(); 

aurait son contexte comme l'objet bar, comme si vous avez utilisé ceci:

foo.call(bar); 

Mais l'utiliser de l'autre variable, comme ceci:

foo(); 

serait utiliser le contexte de foo. Donc, si foo est dans le contexte mondial, il sera équivalent à ceci:

bar.bi.call(window); 
+0

Point intéressant, ce comportement est-il couramment utilisé? – Fdr

+0

@Fdr - Je ne sais pas. Je ne l'ai jamais vraiment vu en action, mais c'est bon à savoir. –

1

Il est juste une affectation composée

var r = x = 3; 

attribue 3 à x, et aussi r, qui est nouvellement déclarée .

Votre exemple remplace simplement une fonction à la place de 3 et une propriété d'objet - bar.bi - à la place de x.

0

Cela dépend de l'endroit où il est utilisé. Les deux foo et bar.bi pointent vers la même fonction ici. Cela signifie que la fonction peut être invoquée à l'aide

foo(); 

et

bar.bi(); 

En même temps, elle diffère de la valeur de this dans la fonction.Pour la première égale à une seconde, il doit être invoqué comme indiqué ci-dessous

foo.call(bar); 

ou

foo.apply(bar); 

Cela garantit que this pointera vers bar dans la fonction.

s'il vous plaît consulter:

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 

barre sera un objet qui répond à la méthode bi.

+0

Je pense que vous trouverez que vos deux premières '===' comparaisons seront '// false' parce que vous comparez deux objets fonction différents. Votre dernier est bien sûr correct. –

+1

Oui. Tu as raison. Merci. – riship89

Questions connexes