Maison > interface Web > js tutoriel > Explication des problèmes courants liés aux fonctions JS

Explication des problèmes courants liés aux fonctions JS

jacklove
Libérer: 2018-05-21 10:54:34
original
1473 Les gens l'ont consulté

Nous rencontrons souvent des problèmes de fonction Javascript lors de nos études, et cet article les expliquera.

Quelle est la différence entre la déclaration de fonction et l'expression de fonction

L'expression de fonction et l'instruction de déclaration de fonction contiennent le même nom de fonction et créent toutes deux de nouveaux objets de fonction. Leur différence réside principalement dans la promotion des variables. sont différents

Le nom de fonction déclaré par la fonction est une variable, et la variable pointe vers l'objet fonction. La promotion variable est le corps variable et fonctionnel de la fonction.

L'expression de fonction est affectée via var, et la fonction entière est affectée à une nouvelle variable. La variable est promue à un nouveau nom de variable et le code d'initialisation de la fonction restera dans sa position d'origine.

Qu'est-ce que la pré-déclaration de variable ? Qu'est-ce que la pré-déclaration d'une fonction ?

La pré-déclaration d'une variable

console.log(a);var a = 1;
结果为underfined
Copier après la connexion

La pré-déclaration d'une variable prendra par défaut ce code :

var a; //Préfixe de déclaration des variables console.log(a);
a = 1;

Préfixe de déclaration de fonction

a()function a(){console.log ("hello") }
Copier après la connexion

Préfixe de déclaration de fonction Le code par défaut est :

function a(){                   //将函数声明提升console.log ("hello") }a()
arguments 是什么
Copier après la connexion

arguments est un objet de type tableau, qui stocke les paramètres transmis lorsque la fonction est exécutée. Vous pouvez utiliser des arguments dans la fonction pour obtenir les paramètres de toutes les fonctions.
Le code suivant :

function say(name,sex,age){  console.log(arguments);
}console.log('name:jiuyi',"sex:男",'age:54')
结果为:"name:jiuyi""sex:男""age:54"
Copier après la connexion

Comment implémenter la surcharge de fonctions

Il n'y a aucun concept de surcharge de fonction dans JS La nouvelle fonction suivante écrasera la fonction précédente du même nom. , même si les paramètres sont différents.

      function p(a,b,c) {  
           console.log(a+b+c);  
       }  
 
       function p(a,b) {  
           console.log(a+b);  
       }       console.log(p('hello','jiuyi','yes'));       console.log(p('hello'))
结果为:  "hellojiuyi"
 "helloundefined"
Copier après la connexion

Comme le montre la figure ci-dessus, cette dernière fonction P couvre la fonction P supérieure.

Quelle est l'expression de la fonction d'exécution immédiate ? Que fait-il ?

Exécuter immédiatement une expression de fonction signifie joindre la déclaration de fonction entière avec () pour devenir une expression de fonction, puis suivre les paramètres, la fonction sera exécutée immédiatement.
function ( ){ }La déclaration de fonction est convertie en ( function (){ }) ( )
Fonction :

Génère sa propre portée et des variables locales indépendantes, sans être perturbé par la promotion de variable. Réduisez la possibilité de conflits entre les variables internes et les variables externes. Les variables seront détruites une fois exécutées.

Quelle est la chaîne de portée d'une fonction ?

Dans JS, elle est divisée en variables globales et en variables locales. Les variables globales sont accessibles à l'intérieur de la fonction, mais les variables locales à l'intérieur de la fonction ne le sont pas. être accessible en dehors de la fonction. Dans les variables Lorsqu'il est à l'intérieur d'une fonction, il recherchera d'abord si la variable est définie dans cette portée. Sinon, il recherchera au niveau suivant jusqu'à ce qu'il trouve la variable requise. S'il n'est pas trouvé dans la variable globale, une erreur sera signalée. Essayez d'utiliser des variables locales pour éviter les interférences avec des variables externes.

1. Sortie du code

  function getInfo(name, age, sex){        console.log('name:',name);        console.log('age:', age);        console.log('sex:', sex);        console.log(arguments); //代表实际参数,所以输出实际参数内容
        arguments[0] = 'valley';//name赋值为valley
        console.log('name', name);//所以这里参数输出为valley
    }
    getInfo('hunger', 28, '男');
    getInfo('hunger', 28);
    getInfo('男');
结果为:
name: hunger
 age: 28
 sex: 男
["hunger", 28, "男"]
name valley
 name: hunger
 age: 28sex: undefined
 ["hunger", 28]
 name valley
name: 男
age: undefined
 sex: undefined["男"]
name valley
Copier après la connexion

2. Écrivez une fonction qui renvoie la somme des carrés des paramètres

  function sumOfSquares(){   var x = 0;   for(var i = 0;i<arguments.length;i++){
   x = x + arguments[i]*arguments[i]
   }   console.log(x)
   }
   sumOfSquares(2,3,4);   
   sumOfSquares(1,3);
结果为:2910
Copier après la connexion

3. le code suivant ? Pourquoi

console.log(a); //La sortie est sous-définie, car JS promouvra les variables globales, a est uniquement déclaré mais non attribué var a = 1; est signalé car b Non déclaré Non attribué

4. Quel est le résultat du code suivant ? Pourquoi le résultat de

sayName(&#39;world&#39;); 
sayAge(10); function sayName(name){ console.log(&#39;hello &#39;, name);
 } var sayAge = function(age){ 
console.log(age); 
};
Copier après la connexion

 :
hello world //Parce que la fonction de préfixe de déclaration de fonction sayName(name) est promue en haut, sayName a une déclaration et un contenu. Rapport d'erreur //Parce que la déclaration de variable précédée de var sayAge est élevée et que la fonction sayAge n'est pas déclarée, une erreur est signalée.

5. Quelle est la sortie du code suivant ? Pourquoi

function fn(){} 
 var fn = 3; console.log(fn);
相当于:  var fn;  function fn(){} ;
  fn = 3;  console.log(fn);    //所以输出为3
Copier après la connexion

6. La sortie du code suivant ? Pourquoi la sortie de

function fn(fn2){   console.log(fn2);   //输出 function fn2(){ console.log(&#39;fnnn2&#39;);}
   var fn2 = 3;   console.log(fn2);   //输出3
   console.log(fn);    //输出 function fn(fn2){ console.log(fn2); var fn2 = 3; console.log(fn2); console.log(fn); function fn2(){ console.log(&#39;fnnn2&#39;); } } fn(10);
   function fn2(){ 
     console.log(&#39;fnnn2&#39;);  //不输出,函数未调用
   } 
} 
fn(10);
相当于:var fn2;                            //声明前置function fn(fn2){  
   function fn2(){                   //函数声明前置
     console.log(&#39;fnnn2&#39;);          //此函数不输出,未调用
   } 
   console.log(fn2);               // 调用的其实是函数fn2
   fn2 = 3;             
   console.log(fn2);            // 此时fn2已被赋值为3
   console.log(fn);              //调用的其实是fn整个函数}
fn(10);
Copier après la connexion

7 donne-t-elle le code suivant ? Pourquoi la sortie de

  var fn = 1;    function fn(fn){         console.log(fn);
    }    console.log(fn(fn));       //结果报错,变量提升,fn为1,直接调用1出错结果相当于:    var fn;    function fn(fn){         console.log(fn);
    }
    fn = 1;    console.log(fn(fn));
Copier après la connexion

8 donne-t-elle le code suivant ? Pourquoi

console.log(j);   //变量提升输出undefined
 console.log(i);    //变量提升输出undefinedfor(var i=0; i<10; i++){   //i循环后结果为10var j = 100; 
} console.log(i);    //输出10
 console.log(j);    //输出100
Copier après la connexion

9. La sortie du code suivant ? Pourquoi

 fn();   var i = 10;   var fn = 20;   console.log(i);   function fn(){       console.log(i);       var i = 99;
       fn2();       console.log(i);       function fn2(){
           i = 100;
        }
    }
代码相当于:var i; 
var fn;function fn(){  
  var i ;  function fn2(){
  i = 100;
  } console.log(i);    //只有声明未赋值输出underfined
  i = 99;
  fn2();                  //经过运行I=100
  console.log(i);      //输出100}
fn();
i = 10;
fn = 20;console.log(i);             //输出10
Copier après la connexion

10. La sortie du code suivant ? Pourquoi le code

 var say = 0;
    (function say(n){        console.log(n);        if(n<3) return;
        say(n-1);
    }( 10 ));    console.log(say);
Copier après la connexion

est-il équivalent à : var say;

   (function say(n){        console.log(n);        if(n<3) return;    
        say(n-1);
    }( 10 ));
      say = 0;    console.log(say);           //输出为0结果为:10987654320
Copier après la connexion

function say est une fonction d'exécution immédiate, et les résultats d'exécution sont 10, 9, 8, 7, 6, 5, 4, 3, 2, et enfin say se voient attribuer une valeur de 0, donc la sortie est 0

Cet article explique les problèmes courants liés aux fonctions js. Pour plus de contenu connexe, veuillez prêter attention à. le site Web PHP chinois.

Recommandations associées :

Explication des fonctions liées à JavaScript

Explication des événements et DOM jquery

Quelques bases modulaires associées

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal