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 JavaScript, mais ma compréhension du concept donne exactement la sortie opposée.
3 réponses
return function a(){};
Ici function ...
est une expression. Une expression de fonction nommée pour être précis. Le a
ici n'a pas beaucoup d'importance, il donne simplement à la fonction anonyme une .name
, mais ce n'est encore qu'une expression de fonction que vous renvoyez.
return
function a(){};
Ici, cela équivaut à:
return;
function a(){};
Ici function a
est une déclaration, pas une expression. Il est hissé, créant un nom local a
dans la portée, en observant le a
extérieur. C'est à dire. il équivaut à:
function b(){
var a = function () {};
a = 10;
return;
}
return
function a() {}
Est identique à
return;
function a() {}
Après insertion automatique du point-virgule. Dans le second cas, la fonction a
est déplacée en haut de sa portée. Le code est le même que
var a = 0;
function b() {
function a() {};
a = 10;
return;
}
b();
console.log(a);
Comme a
à l'intérieur b()
est une fonction interne puis remplacée, elle n'est pas accessible de 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);
Saut de ligne peut être utilisé à la place du point-virgule .
Ce :
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);
Questions connexes
Questions liées
De nouvelles questions
javascript
Pour des questions concernant la programmation dans ECMAScript (JavaScript / JS) et ses divers dialectes / implémentations (hors ActionScript). Veuillez inclure toutes les balises pertinentes dans votre question; par exemple, [node.js], [jquery], [json], etc.