Lorsque la déclaration de fonction javascript est promue, le corps de la fonction sera-t-il promu ensemble ?
PHP中文网
PHP中文网 2017-05-19 10:43:15
0
10
716

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中文网

认证0级讲师

répondre à tous(10)
PHPzhong

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

習慣沉默

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

Peter_Zhu

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

某草草

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

左手右手慢动作

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

洪涛

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.

刘奇

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 ! ~! ~

仅有的幸福

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

洪涛

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');
};

}

phpcn_u1582

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

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal