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.

47
SnapADragon 17 avril 2018 à 11:22

3 réponses

Meilleure réponse
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;
}
56
T.J. Crowder 17 avril 2018 à 15:27
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);
26
Tushar 17 avril 2018 à 08:27

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);
2
Peter Mortensen 17 avril 2018 à 19:02