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 point – virgule .
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);