2010-12-13 3 views
2

Possible en double:
What is the difference between call and apply?s'il vous plaît expliquer l'appliquer et les méthodes d'appel en javascript

Quelle est la principale différence entre les appliquer et appeler des méthodes ... Je passe par le web, mais impossible de trouver la meilleure solution .. S'il vous plaît aidez-moi amis ...

+0

Il n'y a pas de * meilleure * solution *) –

+0

@Fixix: +1, il ne m'est pas venu à l'esprit que ce serait probablement dupe. –

+0

@Felix Kling: Oups, n'a pas remarqué que l'un;) – jwueller

Répondre

5

Chaque fonction JavaScript reçoit deux objets en plus des paramètres par défaut. Ce sont this et arguments. La valeur de this est déterminée par son modèle d'invocation. apply ou call peut être utilisé pour appeler une fonction et lui fournir un objet this par défaut.

Cela sera très utile dans de nombreuses situations. Par exemple, arguments est un objet de type tableau, mais pas vraiment un Array avec toutes les méthodes Array utiles. Donc, pour appliquer une méthode Array slice sur arguments, vous pouvez le faire:

Array.prototype.slice.apply(arguments, [1, 2]) 

Had arguments été un objet de type Array, vous auriez pu utiliser

arguments.slice(1, 2) 

call est rien d'autre qu'une version modifiée d'appliquer. Voir le commentaire d'elusive.

M.Douglus Crockford donne une très bonne introduction aux fonctions JavaScript de cette vidéo: Function the Ultimate.

+0

Quelle est la pertinence des choses sur les 'arguments '? –

+2

OP a posé des questions sur JavaScript depuis un certain temps. Je supposais qu'il commençait avec JS. Je pensais qu'une bonne introduction au modèle d'invocation de fonction lui serait utile. :) – dheerosaur

3

.apply() et .call() sont très similaires. La seule différence est la façon dont ils transmettent des arguments à la fonction appelée. .apply() prend un tableau d'arguments, alors que .call() peut être utilisé comme un appel de fonction régulière:

someFunction.apply(context, [argument1, argument2]); 

équivaut à:

someFunction.call(context, argument1, argument2); 
+0

Merci et agréable à entendre .. mais pouvons-nous utiliser toute méthode à n'importe quelle situation ou y a-t-il des limitations à ces méthodes? – Mihir

+0

@Mihir: Les deux méthodes sont membres du prototype d'objet fonction. Les deux peuvent être utilisés sur n'importe quelle fonction. – jwueller

3

La principale différence est que call accepte une liste d'arguments, où les arguments après la première passe directement à sont la méthode:

myFunc.call(thisObj, arg1, arg2, arg3); 

Alors que apply accepte seulement deux ar guments - le premier est l'objet this et le second est un tableau d'arguments à passer à la méthode:

myFunc.apply(thisObj, [arg1, arg2, arg3]); 

apply est souvent utilisé dans une situation où vous voulez passer l'objet arguments, qui contient une liste de arguments passés à la fonction en cours, à une autre méthode:

function myOtherFunc(arg1, arg2, arg3) { 
    if (typeof arg1 == "object" && arg1 !== null) 
     myFunc.apply(this, arguments); 
} 
+0

Merci et agréable d'entendre .. mais pouvons-nous utiliser n'importe quelle méthode à n'importe quelle situation ou y at-il des limites à ces méhtods .. – Mihir

+0

@Mihir: 'apply' peut être utilisé à la place de' call' à peu près partout où vous pouvez penser de. Cependant, 'call' n'est pas un bon substitut pour' apply' car ce n'est pas aussi dynamique. J'ai mis à jour ma réponse pour vous donner un exemple d'utilisation de 'apply'. –

+1

@Mihir: 'call' est juste du sucre syntaxique pour' apply'. Facilite l'appel de fonctions avec un seul paramètre. –

Questions connexes