La raison d'utiliser JS .méthode call ()?
Je suis intéressé quelle est la raison d'avoir une méthode call() en JS. Il semble qu'il duplique la méthode habituelle de l'appel de this
.
Par exemple, j'ai un code avec call().
var obj = {
objType: "Dog"
}
f = function(did_what, what) {
alert(this.objType + " " + did_what + " " + what);
}
f.call(obj, "ate", "food");
La sortie est "le Chien a mangé de la nourriture". Mais le même résultat je peux obtenir de l'affectation de la fonction de l'objet.
var obj = {
objType: "Dog"
}
f = function(did_what, what) {
alert(this.objType + " " + did_what + " " + what);
}
obj.a = f;
obj.a("ate", "food");
Le résultat est le même. Mais ce chemin n'est plus compréhensible et facile à utiliser. Pourquoi call() est-elle nécessaire?
- Eh bien, vous ne serez pas en mesure d'assigner la fonction à un objet dans tous les cas. E. g. si vous créez une fonction qui accepte un rappel et de vous permettre également de son contexte pour être adoptée, vous pouvez assigner la fonction de rappel de l'objet et de l'appeler directement, mais quel nom choisiriez-vous? Vous pouvez remplacer une méthode existante.
call
fournit un moyen simple de résoudre ce problème.
Vous devez vous connecter pour publier un commentaire.
call
est utilisé lorsque vous souhaitez contrôler le champ qui sera utilisé dans la fonction appelée. Vous voudrez peut-être lethis
mot-clé pour être autre chose que le champ d'application que vous avez attribué à la fonction, dans ce cas, vous pouvez utilisercall
ouapply
pour appeler la fonction avec votre propre champ d'application.F. ex, il vous permet également d'appeler les méthodes de l'utilitaire en dehors du champ, comme lors de l'utilisation de "privé" fonctions:
Dans l'exemple ci-dessus,
privateFn
n'est pas exposée dansobj
mais il peut encore être construites comme si c'était une partie de la portée publique (à l'aide dethis
de la même manière).publicFn: function() { ... }
avecpublicFn: privateFn.bind(this)
. Pendant que vous êtes à la définition de la fonction, l'objet de retour n'a pas encore été créé de sorte que le contexte sera simplementwindow
, comme il n'y a aucune autre contexte, à ce moment-là.call
ne le fait pas. Aussi,fn.bind(this)('foo')
est moins lisible que la version defn.call(this, 'foo')
2017 mise à Jour
Toutes les fonctions par le biais de la Fonction.prototype ont la
.call
méthode. La raison d'utiliser des.call()
est de préciser ce que la variable "this
" se réfère à.MDN précise:
De considérer les éléments suivants:
En mode strict
x()
retourneundefined
non en mode strict, elle retourne l'objet Global,Window
dans un contexte du navigateur.Exemple avec
.call()
nous dire quoi "this
" fait référence à:Résultat:
{myName: "Robert", myLocation: "Earth"}
. Dans l'exemple ci-dessus, nous sommes en précisant leobj
objet que la valeur dethis
l'intérieur de la fonctionx()
Il peut être utilisé pour émuler l'héritage en POO.
Exemple:
Permet de dire que le ci-dessus est un maître de l'objet(prototype) et que vous souhaitez hériter de la fonction
describe
dans un autre objet:La
Richard
l'objet n'a pas le décrire la fonction et que vous voulez tout simplement hériter ,pour ainsi dire, la fonction. Vous serait-il faire comme si:De sortie:
This is me Richard Sash 25 6,4 male
this
paramètre dans lacall
méthode comme:Robert.describe.call(this,Richard)
. Quel est le rôle dethis
ici?this
fait référence à l'objet courant, l'objet appelant. Avec.call()
vous pouvez écrire une méthode une fois et hériter d'un autre objet de votre choix sans avoir à écrire de nouveau, en prenant soin de les SÉCHER principe.Person
objet avec une fonction prototypedescribe
puis Robert/Richard peut être basé sur cet objet (c'est à direvar Robert = new Person(...);
)... je suppose que vous avez mentionné ci-dessus que Robert est un maître de l'objet, donc je suppose que nous pourrions utiliser.call
dans des endroits où nous avons besoin d'utiliser une fonction d'un autre objet pour un autre objet?Vous devriez probablement utiliser la deuxième façon, dans votre exemple, mais parfois vous voulez utiliser un objet de fonctions sur un autre objet. Un exemple serait d'utiliser
Array
méthodes sur le Tableau comme des objets commeNodeList
sC'est à voir avec le concept de la première classe de la fonction. Fondamentalement langages comme Javascript permettent de traiter des fonctions comme les choses de leur propre droit. Les fonctions peuvent être stockées dans des variables ou transmis à d'autres fonctions.
call()
fournit un moyen d'exécuter un permanent gratuit fonction n'est lié à aucun autre objet.call()
?