console.log(e());//error
if(true){
function e() {
return 10;
}
}
if(true){
function e() {
return 10;
}
}
console.log(e());//10
Si la promotion de la déclaration de fonction n'est promue qu'à la portée if, alors quelle est la raison de ce qui précède ? (Test Chrome 58) Pourquoi les fonctions dans le cadre de if sont-elles accessibles de l'extérieur Veuillez me donner une réponse
?
Il s'agit en fait d'un problème historique...
Auparavant dans ES5, la spécification stipulait que les fonctions ne pouvaient être déclarées que dans la portée de niveau supérieur et la portée de fonction, et non dans la portée de niveau bloc. Par conséquent, des déclarations comme celle-ci sont en réalité illégales :
Mais en fait, tous les principaux navigateurs ne se conforment pas à cette spécification pour des raisons de compatibilité.
Dans l'ère ES6 actuelle, la spécification stipule l'existence d'une portée au niveau du bloc et les fonctions peuvent être définies dans une portée au niveau du bloc.
Mais en fait, les choses ne sont pas si simples, car dans ce cas, le comportement défini de la fonction sera incompatible avec le passé. Afin d'assurer la compatibilité avec le passé, ES6 stipule en annexe B que l'implémentation du navigateur n'a pas besoin. respecter les réglementations ci-dessus. Ayez votre propre façon de vous comporter.
Dans les navigateurs ES6, ils se comportent en fait comme ceci :
Autoriser la définition des fonctions dans la portée du bloc
La déclaration de fonction sera en fait similaire à l'expression de fonction déclarée à l'aide de
var
, et le nom de la fonction sera promu en haut de la portée actuelle de la fonctionDans le même temps, les déclarations de fonction maintiendront également le comportement de levage dans la portée au niveau du bloc
Pour votre premier code, si vous examinez de plus près l'erreur qu'il signale, vous constaterez que l'erreur ressemble à ceci :
Uncaught TypeError : e is not a function
.Uncaught TypeError: e is not a function
。这个错误表示,
e
不是函数,换句话来说,就是e
Cette erreur signifie quee
n'est pas une fonction. En d'autres termes, la variablee
existe, mais ce n'est pas une fonction. En combinant les trois règles que nous avons mentionnées ci-dessus, il est facile de penser que cela se déroule réellement ainsi :Après la promotion variable, cela deviendra comme ceci :
Pas besoin de mentionner le deuxième morceau de code.
La déclaration de fonction dans l'instruction if ne sera pas promue, tout comme l'expression de fonction, donc la première est une erreur de syntaxe et la seconde affichera 10
équivaut à =>