recherche

Maison  >  Questions et réponses  >  le corps du texte

Lorsque la déclaration de fonction javascript est promue, le corps de la fonction sera-t-il promu ensemble ?

Promotion de la déclaration de fonction Javascript, le corps de la fonction sera-t-il promu ensemble ?

Si n'est pas , il existe le contre-exemple suivant :

console.log(demo.toString()); //‘function demo() {console.log('ok')}’

demo(); //‘ok’

function demo() {
    console.log('ok')
}

Si est , il existe le contre-exemple suivant :

console.log(func)  // undefined   ,如果直接执行func()函数抛出TypeError异常 
if(true){
    function func() {
        console.log('11');
    };
}else{
    function func() {
        console.log('22');
    };
}
func(); // 11

Le premier exemple montre que le corps de la fonction est également promu. Si vous comprenez le deuxième morceau de code selon cette idée, les fonctions "renommer" se couvriront, et les suivantes couvriront les précédentes, donc console. log(func) La chaîne 'function func() {console.log('22');};' sera affichée, mais ce n'est pas réellement le cas.

Trois questions se posent :

  1. Comment comprenez-vous « promotion variable, priorité fonction » ?

  2. La fonction corporelle est-elle également améliorée ?

  3. Comment interpréter les résultats du deuxième morceau de code ?

PHP中文网PHP中文网2775 Il y a quelques jours731

répondre à tous(10)je répondrai

  • PHPz

    PHPz2017-05-19 10:45:15

    Je pense que vous comprendrez tout après avoir lu l'article que j'ai écrit et que vous aurez une compréhension approfondie des concepts de contexte d'exécution JavaScript, de pile de fonctions et de promotion

    répondre
    0
  • 習慣沉默

    習慣沉默2017-05-19 10:45:15

    if représente un jugement conditionnel. Le code ne doit pas être exécuté lors de la compilation, mais seules la syntaxe et l'analyse lexicale seront vérifiées. Vous pouvez essayer de changer de navigateur ou activer le mode strict pour les tests. Des choses inattendues peuvent se produire ~

    .

    1. Promotion variable, priorité de fonction, c'est-à-dire var a = 1; function fun(){}; in var a; et function fun(){} seront promus au niveau supérieur de la portée.
    2. Également amélioré. L'expression de fonction ne le sera pas, car c'est var fun = function(){}; Ce type ne fera qu'améliorer var fun;
    3. Le deuxième paragraphe peut en fait être expliqué de la manière suivante

    .
    var func;
    console.log(func)
    if(true){
        func=function func() {
            console.log('11');
        };
    }else{
        func=function func() {
            console.log('22');
        };
    }
    func(); // 11
    
    

    répondre
    0
  • 天蓬老师

    天蓬老师2017-05-19 10:45:15

    Pour une introduction détaillée, voir MDN http://kangax.github.io/nfe/#...

    répondre
    0
  • 某草草

    某草草2017-05-19 10:45:15

    En mode non strict, la promotion de la déclaration de fonction placée dans l'instruction if dépend de l'implémentation de chaque noyau.

    La conclusion est que la fonction sera améliorée, mais cela dépend de l'implémentation de chaque noyau à l'intérieur de l'instruction if.

    Le mode strict interdit les déclarations de fonctions qui ne sont pas au niveau du script ou de la fonction

    répondre
    0
  • ringa_lee

    ringa_lee2017-05-19 10:45:15

    Vous pouvez vous référer à : /q/10...

    répondre
    0
  • PHP中文网

    PHP中文网2017-05-19 10:45:15

    Les déclarations de fonctions et de variables seront promues. La promotion de fonctions a priorité sur la promotion de variables. Le code à exécuter directement ne peut pas être promu. Le premier code est directement amélioré. La fonction que vous avez définie dans le deuxième code se trouve dans la structure de l'instruction if. Les deux journaux et if doivent être exécutés dans l'ordre dans la pile en cours d'exécution. De toute évidence, votre fonction n'a pas été déclarée avant l'exécution de l'instruction if.

    répondre
    0
  • 怪我咯

    怪我咯2017-05-19 10:45:15

    es6 a des règles de portée au niveau du bloc. Si vous l'exécutez avec une ancienne version de node ou une version inférieure de Chrome, cela équivaut au code suivant
    .

    function func() {
       console.log('22');
    };
    
    console.log(func);
    if(true){
    }else{
    }
    
    func(); // 22
    

    Cependant, les versions supérieures de node et chrome limitent l'amélioration de ces variables, ce qui conduit à la situation dans votre code ! ~! ~

    répondre
    0
  • 仅有的幸福

    仅有的幸福2017-05-19 10:45:15

    Parce que JavaScript est une portée au niveau de la fonction (function-level scope
    所以if中并没有独立维护一个scope

    Explication en anglais :
    javascript-variable-scope-and-hoisting-explained
    Explication en chinois : portée Javascript et levage de variable

    répondre
    0
  • PHP中文网

    PHP中文网2017-05-19 10:45:15

    Il n'est généralement pas recommandé d'écrire des déclarations de fonction dans des instructions conditionnelles.
    Il s'agit d'une syntaxe invalide dans ECMAScript, et le moteur javascript tentera de corriger l'erreur et de la convertir dans un état normal et raisonnable. Cependant, cette méthode de correction est différente selon les navigateurs. Il est recommandé d'utiliser l'expression de fonction :
    var func;
    if(true){

    func=function {
        console.log('11');
    };

    }autre{

    func=function {
        console.log('22');
    };

    }

    répondre
    0
  • phpcn_u1582

    phpcn_u15822017-05-19 10:45:15

    http://blog.csdn.net/qq673318...
    Le lien a une explication
    ————Porter

    répondre
    0
  • Annulerrépondre