Explication de levage JavaScript

Quelle est la différence entre les extraits ci-dessous?

var a = 0; function b(){ a = 10; return function a(){}; } b(); console.log(a); // => 10 

et

 var a = 0; function b(){ a = 10; return function a(){}; } b(); console.log(a); // => 0 

Cela a quelque chose à voir avec le levage de JavaScript, mais ma compréhension du concept donne exactement le résultat inverse.

 return function a(){}; 

Ici la function ... est une expression. Une expression de fonction nommée pour être précise. Le a ici ne compte pas beaucoup, il donne juste à la fonction anonyme un nom, mais c’est toujours une expression de fonction que vous retournez.

 return function a(){}; 

Ceci est équivalent à:

 return; function a(){}; 

Ici, la function a est une déclaration, pas une expression. Il est hissé, créant un nom local a dans la scope, en ombrant l’extérieur a . Ie c’est équivalent à:

 function b(){ var a = function () {}; a = 10; return; } 
 return function a() {} 

est la même que

 return; function a() {} 

après insertion automatique du point-virgule. Dans le second cas, la fonction a est déplacée au sumt de sa scope. Le code est le même que

 var a = 0; function b() { function a() {}; a = 10; return; } b(); console.log(a); 

Comme a intérieur b() est une fonction interne et est ensuite remplacé, il n’est pas accessible depuis l’extérieur de b() .

Voici la démo pour comprendre comment fonctionne le levage.

 var a = 0; function b() { console.log(a); // function a = 10; console.log(a); // 10 return function a() {}; } console.log(b()); // undefined console.log(a); 

Le saut de ligne peut être utilisé à la place du pointvirgule .

Ceci :

 var a = 0; function b(){ a = 10; return // line-break function a(){}; } b(); console.log(a); // => 0 

signifie ceci:

 var a = 0; function b(){ a = 10; return; // <-- 'adds this semicolon' function a(){}; } b(); console.log(a); // => 0 

Si vous avez besoin de ce saut de ligne , vous pouvez faire comme ceci :

 var a = 0; function b(){ a = 10; return ( function a(){} ) } b(); console.log(a);