Maison  >  Article  >  interface Web  >  Étudiez les notes sur appel et appliquez les compétences Javascript_javascript

Étudiez les notes sur appel et appliquez les compétences Javascript_javascript

WBOY
WBOYoriginal
2016-05-16 16:35:59962parcourir

Regardons d'abord l'explication de l'appel dans MDN

La méthode call() appelle une fonction ou une méthode en utilisant une valeur this spécifiée et plusieurs valeurs de paramètres spécifiées.

Remarque : La fonction de cette méthode est similaire à la méthode apply(). La seule différence est que la méthode call() accepte une liste de plusieurs paramètres, tandis que la méthode apply() accepte un tableau contenant plusieurs paramètres.

Grammaire

fun.call(thisArg[, arg1[, arg2[, ...]]]) 

Paramètres
cetArg

La valeur this spécifiée lorsque la fonction amusante est en cours d'exécution. Il est à noter que la valeur this spécifiée n'est pas nécessairement la valeur this réelle lorsque la fonction est exécutée. Si la fonction est en mode non strict, la valeur this spécifiée comme nulle et indéfinie pointera automatiquement vers l'objet global (dans le navigateur, c'est un objet fenêtre), et celui dont la valeur est une valeur primitive (nombre, chaîne, valeur booléenne) pointera vers l'objet d'encapsulage automatique de la valeur primitive.

arg1, arg2, ...

La liste des paramètres spécifiés.

Les exemples sur MDN n'étaient pas faciles à comprendre au début, alors je les ai postés ici. Si vous êtes intéressé, vous pouvez les consulter par vous-même en appelant Javascript

.

Le thisArg ici est interprété comme la valeur this spécifiée lorsque fun est en cours d'exécution. C'est-à-dire qu'après avoir utilisé call, this in fun pointe vers thisArg ? Regardez le code

 var p="456"; 
 function f1(){ 
  this.p="123"; 
 } 
 function f2() { 
  console.log(this.p); 
 } 
 f2();       //456  f2.call(f1());  //123  f2.apply(f1());  //123

La première sortie est la variable globale de l'appel. Plus tard, en raison de l'utilisation de call et apply, celle-ci dans f2 pointe vers f1, donc la sortie devient 123. En fait, f1 emprunte la méthode de f2 et génère sa propre p

À ce moment-là, supprimez this.p dans f1(), et trois 456 seront affichés, ce qui confirme que lorsque ceci est nul ou indéfini, il pointe en fait vers la variable globale

Quant à pointer vers la valeur d'origine, il pointe vers son objet d'emballage. Étant donné que les objets d'emballage que je comprends sont temporaires et que le test ne renvoie que le type de la valeur d'origine au lieu de l'objet, comment puis-je le prouver ici ? quelqu'un sait, j'espère que vous pourrez en discuter avec moi, merci !

Puisque l'appel peut réaliser un objet en empruntant un autre objet, ne peut-il pas également réaliser l'héritage ? Regardez le code

 function f1(){ 
  this.father="father"
 } 
 function f2() { 
  f1.call(this); 
  this.child="child"; 
 } var test=new f2(); 
console.log(test.father);  //father

Il n'y a pas de père dans le test, à cause du

dans f2()

f1.call(this);

Cela pointe ici vers f2, ce qui signifie que f2 emprunte la méthode de f1, qui réalise en fait l'héritage

Parlons des paramètres ici. Les paramètres ici sont transmis à fun. Regardons le code

.
 function f1(){ 
  this.p="123"; 
 } 
 function f2(x) { 
  console.log(this.p); 
  console.log(x); 
 } 
 f2.call(f1(),456);   //123 
//456

La première sortie est 123 à cause du p dans f1, et la suivante 456 est le paramètre passé à f2, ce qui est facile à comprendre

L'essentiel est de faire attention à la différence entre les paramètres d'appel et d'application

l'appel est passé un par un, et l'application est passée dans un tableau

  function f1(){ 
  this.p="测试call"; 
 } 
 function f2(x,y,z) { 
  console.log(this.p); 
  console.log(x); 
  console.log(y); 
  console.log(z); 
 } 
   function f3(){ 
  this.p="测试apply"; 
 } 
 f2.call(f1(),4,5,6);  
 f2.call(f1(),[4,5,6]);  
 f2.apply(f3(),[4,5,6]); 
 f2.apply(f3(),4,5,6);

Vous pouvez voir les résultats ici

Le premier appel test est émis correctement

Puisque le deuxième appel de test est passé dans un tableau, il génère d'abord un tableau puis deux non définis

La troisième section du test applique correctement les sorties

Le quatrième paragraphe signale directement une erreur due à un format de paramètre incorrect

La différence ici devrait être évidente

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn