Appel appliquer la méthode avec les arguments en JavaScript
Je voulais appeler une fonction en utilisant le javascript s'appliquent() la méthode. Cela fonctionne bien si la fonction n'a pas d'arguments. c'est à dire
function test()
{
console.log(this);
}
body = document.getElementsByTagName("body")[0]; //shortcut to body element
test.apply(body); //returns [object HTMLBodyElement]
Mais je n'arrive pas à faire la même chose pour appeler une fonction qui a des arguments:
function test(msg)
{
console.log(msg);
}
body = document.getElementsByTagName("body")[0]; //shortcut to body element
test(this).apply(body); //mysteriously returns the correct result, then
//typeError: 'undefined' is not an object (evaluating "test(this).apply".
Les exemples ci-dessus sont complètement trivial, mais le grain de ma question est: Comment puis-je utiliser l'appliquer() méthode pour appeler une fonction avec des arguments.
OriginalL'auteur dkugappi | 2011-10-06
Vous devez vous connecter pour publier un commentaire.
prend deux arguments:
Le premier argument définit la valeur de
this
lorsque la fonction est exécutée. Le deuxième est un tableau de paramètres pour cette fonction.Dans vos exemples, vous pouvez réécrire comme suit:
et de l'appeler comme suit:
test.apply(null, body)
pauses pour moi (Chrome 35), maistest.apply(null, [body])
œuvres.Qu'est-ce que l'utilisation réelle de l'aide d'appliquer la méthode est-il des avantages?
Je suis sûr qu'il y a une foule de réel utilise. Certains qui viennent à l'esprit sont à monkey patch fonctions (y compris built-ins), pour le variadic fonctions, et pour la spécification des
this
pour les fonctions de rappel.disons simplement que j'ai une fonction comme
function test(msg){..}
& j'ai besoin de cette valeur & veulent aussi valeur de message dansmsg
seulement?test.call(newThisObj,'new this obj set');
valeur serait disponible dansarguments
au lieu demsg
vous pouvez utiliser les éléments suivants
test.apply(this, ['new this obj set']);
OriginalL'auteur John Keyes
Premier avis que vous êtes réellement appeler votre fonction immédiatement, la ligne:
Échoue parce que, d'abord, vous appelez la
test
fonction passantthis
comme un argument, et puis vous essayez d'accéder à unapply
de propriété sur le résultat de la fonction, qui estundefined
depuis votre fonction ne retourne rien.Que l'accès à la propriété sur le
undefined
valeur est de vous donner l'TypeError
exception.Maintenant, nous allons voir ce que vous voulez vraiment faire, si vous souhaitez passer la valeur de la
body
variable comme argument de votre fonction, le réglage de l'extérieurthis
valeur, comme lethis
valeur detest
, vous pouvez le faire:Mais c'est pourquoi les
call
méthode existe, lorsque vous savez exactement où les arguments à passer, vous n'avez pas besoin de créer un tableau pour rien, vous venez de passer les arguments:La
apply
méthode est vraiment utile lorsque vous traitez avec par exemple une dynamique certain nombre d'arguments, quand vous savez quels sont les arguments qui de le passer, et ont encore la capacité de réglage de lathis
valeur,call
est juste ce dont vous avez besoin.call
: developer.mozilla.org/en/JavaScript/Reference/Global_Objects/...OriginalL'auteur CMS
Appliquer, vous envoyer un tableau d'arguments comme deuxième argument:
Ici est d'appliquer de la documentation sur le MDN docs https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/apply
est bon, je devrais avoir payé plus d'attention à mon copier-coller. J'ai corrigé l'erreur de syntaxe.
Je vais supprimer mes commentaires ici si vous le souhaitez. Ils ne sont pas en ajoutant à la réponse.
OriginalL'auteur bittersweetryan
Assurez-vous d'ajouter l'argument:
OriginalL'auteur bbg