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 :
Comment comprenez-vous « promotion variable, priorité fonction » ?
La fonction corporelle est-elle également améliorée ?
Comment interpréter les résultats du deuxième morceau de code ?
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
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
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){
}autre{
}
http://blog.csdn.net/qq673318...
Le lien a une explication
————Porter