javascript - si l'instruction affecte la déclaration de fonction
滿天的星座
滿天的星座 2017-06-12 09:27:40
0
3
738
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

?
滿天的星座
滿天的星座

répondre à tous(3)
伊谢尔伦

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 :

if (true) {
    function f() {}
}

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 :

  1. Autoriser la définition des fonctions dans la portée du bloc

  2. 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 fonction

  3. Dans 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不是函数,换句话来说,就是eCette erreur signifie que e n'est pas une fonction. En d'autres termes, la variable e 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 :

console.log(e());//error

if(true){
    var e = function() {
        return 10;
    }
}

Après la promotion variable, cela deviendra comme ceci :

var e;
console.log(e());

if(true){
    e = function() {
        return 10;
    }
}

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

学霸

if(true){
    function e() {
        return 10;
    }
}

équivaut à =>

var e
//e为undefined 所以下面报错
console.log(e());//error
if(true) {
    e = function() {
        return 10;
    }
    //if内的其他语句
}
//e已经被修改为function了,所以下面的语句正常
console.log(e());//10
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal