Si vous n'avez jamais été exposé à des langues dynamiques et que vous comprenez JavaScript dans un état d'esprit de langue compilé, vous aurez un sentiment magique et étrange, car des choses qui sont souvent impossibles dans la conscience se produisent, et vous vous sentez même déraisonnable. Si vous rencontrez ce sentiment en train d'apprendre JavaScript, un langage libre et sans fin, puis à partir de la forme actuelle, veuillez lâcher votre "préjugés", car c'est définitivement un nouveau monde pour vous, laissez JavaScript faire fondre lentement la conscience de programmation solidifiée précédente et injectez une nouvelle vitalité!
OK, revenons au point, comprenons d'abord les caractéristiques de contexte de JavascrTipt transformé dynamiquement transformé. Cette caractéristique se reflète principalement dans l'application des deux méthodes d'application et d'appel.
Pour distinguer l'application, appelez une phrase,
foo.Call (this, arg1, arg2, arg3) == foo.apply (this, arguments) == this.foo (arg1, arg2, arg3)
Appelez et appliquez les deux appartiennent à une méthode de fonction. ProTotype. Il est mis en œuvre intrinsèquement par le moteur JavaScript. Parce qu'il appartient à function.prototype, chaque instance d'objet de fonction, c'est-à-dire que chaque méthode a un attribut d'appel et d'application. Puisqu'il s'agit d'une propriété d'une méthode, leur utilisation est bien sûr destinée à la méthode. Ces deux méthodes sont faciles à confondre car elles ont la même fonction, mais elles sont utilisées différemment.
Similitudes: les effets des deux méthodes sont exactement les mêmes
Différences: les paramètres passés par la méthode sont différents
Alors, quel est l'effet de la méthode et quels sont les paramètres passés par la méthode?
Analysons le Foo.Call ci-dessus (ceci, Arg1, Arg2, Arg3).
FOO est une méthode, il s'agit d'un objet lié au contexte lorsque la méthode est exécutée, Arg1, Arg2 et Arg3 sont des paramètres transmis à la méthode FOO. L'objet soi-disant contextuel lorsque la méthode est exécutée, s'il y a une base de programmation orientée objet, il est facile à comprendre, c'est celui-ci dans l'objet après l'instanciation de classe.
Dans JavaScript, le code a toujours un objet de contexte et le code le traite à l'intérieur. L'objet de contexte est incarné par cette variable, qui pointe toujours vers l'objet dans lequel le code actuel est situé.
Afin de mieux comprendre ce que c'est, donnez un exemple.
/ Créer une classe A Fonction a () {// Le code suivant sera exécuté lorsque la classe est instanciée // L'objet de contexte d'exécution à l'heure actuelle est le suivant, qui est l'objet d'instance actuel this.message = "Message de A"; this.getMessage = function () {<span style = "white-espace: pre"> </span> return this.message; <span style = "white-space: pre"> </span>}} // créer une classe un objet d'instance var a = nouveau a (); // calendate a class a instance object var a = new a (); // calendate a Class instance getMessage vawe Classe B Fonction B () {this.message = "Message de B"; this.setMessage = function (msg) {<span style = "white-space: pre"> </span> this.message = msg; <span style = "white-space: pre"> </span>}} // créer un objet d'instance de classe B var a = new b ();On peut voir que les classes A et B ont un attribut de message (vers les membres mentionnés dans l'objet). A a une méthode GetMessage pour obtenir des messages, et B a une méthode SetMessage pour définir des messages. Ce qui suit est de montrer la puissance de l'appel.
// Dynamic Attribuez une méthode SetMessage de B pour objection a. Notez que A lui-même n'a pas cette méthode! b.setMessage.Call (A, "A. A"); // Tous affichent l'alerte "Message de A" (A.GetMessage ()); // Dynamic Attribuez une méthode GetMessage de A à l'objet b. Notez que B lui-même n'a pas cette méthode!
C'est la puissance de l'appel JavaScript de langue dynamique!
C'est simplement "créer quelque chose à partir de rien". Les méthodes de l'objet peuvent être attribuées arbitrairement, mais l'objet lui-même n'a jamais eu cette méthode. Notez que c'est une affectation. En termes de laïque, la méthode consiste à prêter un autre objet pour terminer la tâche. En principe, l'objet de contexte change lorsque la méthode est exécutée.
Par conséquent, B.SetMessage.Call (A, "Message de A"); équivaut à l'utilisation d'un objet de contexte en tant que contexte pour appeler la méthode SetMessage de l'objet B lors de l'exécution, et ce processus n'a pas de relation avec B, et son effet est équivalent à A.SetMessage ("Message de A");
Parce que l'effet de l'application et de l'appel est le même, on peut dire que
Appelez, appliquez la fonction est d'emprunter les méthodes des autres pour appeler, tout comme l'appeler.
OK, après avoir compris les similitudes entre appel et appliquer - après les comprendre, jetons un œil à leurs différences. Après avoir regardé les exemples ci-dessus, je crois que vous le savez.
De B.SetMessage.Call (A, «Message de A») est équivalent à A.SetMessage («Message de A»), il peut être vu que «le message de A» est passé comme paramètre dans l'appel,
Alors, comment cela signifie-t-il en application? Il est difficile de l'expliquer clairement. L'application doit être combinée avec les scénarios d'application pour être claire en un coup d'œil. Concevons un scénario d'application:
Fonction Print (a, b, c, d) {alert (a + b + c + d);} Exemple de fonction (a, b, c, d) {// emprunter l'impression dans la méthode d'appel, et disperser explicitement les paramètres pour passer l'impression. Méthode directement imprime.Apply (ceci, arguments); // ou le résumer dans un array print.apply (this, [a, b, c, d]);} // l'exemple "script rétroéclairé" ("back", "light", "pied", "this"););Dans ce scénario, dans l'exemple de la méthode, A, B, C, D est utilisé comme paramètres passés par la méthode, et les méthodes utilisent et appelez pour emprunter la méthode d'impression à appeler.
Dans la dernière phrase, puisque l'exemple de méthode est appelé directement, l'objet de contexte dans cette méthode est un objet Window.
Par conséquent, à l'exception du premier paramètre, c'est-à-dire que l'objet de contexte est le même lors de l'exécution, les autres paramètres de la méthode d'appel seront transmis à la méthode empruntée en tant que paramètres à leur tour, tandis que l'application a deux paramètres, et le deuxième paramètre est passé dans un tableau. Il peut donc être dit que
La différence entre les méthodes d'appel et d'application est qu'à partir du deuxième paramètre, les paramètres de la méthode d'appel seront transmis à la méthode empruntée en tant que paramètres à leur tour, tout en appliquant directement ces paramètres dans un tableau puis les transmet. Enfin, la liste des paramètres de la méthode empruntée est la même.
Scénarios d'application:
L'appel est disponible lorsque les paramètres sont clairs et que les arguments appliquent peuvent être utilisés lorsque les paramètres ne sont pas clairs.
// Exemple print.call (fenêtre, "back", "Light", "Foot", "this"); // Les paramètres FOO peuvent être plusieurs fonctions foo () {<span style = "White-Space: pre"> </ span> print.apply (fenêtre, arguments);}L'article ci-dessus comprend profondément la différence entre les méthodes Apply () et Call () en JavaScript. C'est tout le contenu que je partage avec vous. J'espère que vous pourrez vous faire référence et j'espère que vous pourrez soutenir Wulin.com plus.