47 votes

Explication du levage JavaScript

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

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

y

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 le résultat inverse.

15 votes

Lorsque vous utilisez return sur une rangée de lui-même, c'est ce qu'il fait, retourner et quitter le function b() . Javascript ajoutera automatiquement un ; après elle.

2 votes

Les déclarations de fonctions sont traitées avant l'exécution de tout code (ce que l'on appelle le "hoisting"). Par conséquent, peu importe où elles sont placées, elles sont toujours évaluées.

56voto

deceze Points 200115
return function a(){};

Ici function ... est une expression. A expression de fonction nommée pour être précis. Le site a ici n'a pas beaucoup d'importance, il donne juste à la fonction anonyme un .name mais c'est toujours une expression de fonction que vous retournez.

return 
function a(){};

Ceci est équivalent à :

return;
function a(){};

Ici function a est une déclaration, pas une expression. Elle est hissée, créant un nom local a dans le champ d'application, faisant de l'ombre à l'extérieur a . C'est-à-dire qu'il est équivalent à :

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

0 votes

Merci @deceze, j'ai manqué de le remarquer. fonction a() dans le premier extrait est une expression de fonction, et une déclaration de fonction dans le deuxième extrait. Et, une Expression des fonctions n'est défini que lorsque cette ligne est atteinte, alors que Déclaration de fonction est défini dès que la fonction ou le script qui l'entoure est exécuté.

26voto

Tushar Points 23732
return
function a() {}

est identique à

return;
function a() {}

après l'insertion automatique du point-virgule. Dans le second cas, la fonction a est déplacé vers le 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 de b() est une fonction interne et ensuite surchargée, elle n'est pas accessible depuis l'extérieur de l'application b() .

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

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);

1 votes

Merci Tushar, mais je voulais savoir pourquoi. fonction a() n'est pas hissé dans le 1er extrait alors qu'il est hissé dans le 2ème extrait. @deceze l'a bien expliqué dans sa réponse.

0 votes

@SnapADragon Alors pourquoi cette question a plus de votes positifs qu'elle ?

1 votes

Car la réponse de Tushar a peut-être mieux servi à d'autres, mais @deceze a expliqué ce que je cherchais. C'est assez satisfaisant ?

2voto

Michal Smolarek Points 31

Saut de ligne peut être utilisé à la place de point-virgule .

Ce site :

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 besoin de ce Saut de ligne vous pouvez faire comme este :

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

0voto

Hidayt Rahman Points 1045

Supposons.

Vous jouez au cricket. Le lanceur est en route et vous venez de frapper votre batte en l'air.

Serait-il abattu ? Non !

Donc si nous supposons Hoisting es cricket Par conséquent, il n'y a aucun sens à frapper la balle tant que le lanceur ne la lance pas.

Exemple rapide :

Hissé

console.log('batsman hit but ', ballStatus()); // batsman hit but  true

function ballStatus() {
    return true;
}

Non-Hoisted

 console.log('batsman hit but ', ballStatus()); // Uncaught TypeError: ballStatus is not a function

 var ballStatus = function() {
    return true;
 }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X