83 votes

JavaScript "hissage

Je suis tombé sur le "hissage" JavaScript et je n'ai pas compris comment ce bout de code fonctionne réellement :

var a = 1;

function b() {
    a = 10;
    return;

    function a() {}
}

b();
alert(a);

Je sais que la déclaration de fonction comme ( function a() {} ) va être hissé au sommet de la fonction b mais il ne doit pas remplacer la valeur de l'option a (parce que les déclarations de fonctions remplacent les déclarations de variables, mais pas l'initialisation des variables). Je m'attendais donc à ce que la valeur de l'alerte soit 10 au lieu de 1 !

112voto

Quentin Points 325526
  1. Le marché mondial a est réglé sur 1
  2. b() s'appelle
  3. function a() {} est hissé et crée un local variable a qui masque l'ensemble a
  4. Le local a est réglé sur 10 (en écrasant la fonction a )
  5. Le marché mondial a (encore 1 ) est alerté

6voto

fraveydank Points 51

C'est parce que l'ordre de compilation/interprétation dans cet exemple est quelque peu trompeur. Le site function a () {} est interprétée avant que le reste de la fonction ne soit exécuté, donc au tout début de la fonction, a a la valeur de function a () {} . Lorsque vous le réaffectez à 10 vous réaffectez la valeur de a dans la portée locale de la fonction b() qui est ensuite jeté au retour, laissant la valeur originale de a = 1 dans la portée globale.

Vous pouvez le vérifier en plaçant alert() ou autres aux endroits appropriés pour voir quelle est la valeur de l'option a est à différents points.

5voto

Grijesh Chauhan Points 28442

(1) JavaScript n'a pas de portée d'énoncé de bloc ; plutôt, il sera local au code dans lequel le bloc réside.

(2) La déclaration des variables en Javascript dans la portée d'une fonction, ce qui signifie que les variables déclarées dans une fonction sont disponibles partout dans cette fonction, même avant qu'une valeur ne leur soit attribuée. .

(3) Dans le corps d'une fonction, une variable locale a la priorité sur une variable globale de même nom. Si vous déclarez une variable locale ou un paramètre de fonction avec le même nom qu'une variable globale, vous cacher efficacement la variable globale .

votre code est le même que : ( lire le commentaire )

<script>
var a = 1;          //global a = 1
function b() {
    a = 10;         
    var a = 20;     //local a = 20
}
b();
alert(a);           //global a  = 1
</script>

référence :
(1) JavaScript Variable Scope :
(2) Un exemple dangereux de levage de Javascript
(3) Portée variable

Donc dans votre code :

var a = 1;          //global a = 1  
function b() {
    a = 10;         
    return;
    function a() {} //local 
}
b();
alert(a);           //global a = 1

2voto

KhanSharp Points 1754
  1. déclaration de fonction function a(){} est hissé en premier, donc en portée locale. a est créé.
  2. Si vous avez deux variables avec le même nom (une dans global et une autre dans local), la variable locale aura toujours la priorité sur la variable globale.
  3. Lorsque vous définissez a=10 vous définissez la variable locale a et non le global.

Par conséquent, la valeur de la variable globale reste la même et vous obtenez l'alerte 1.

0voto

Jonathan Points 63

Quand j'ai lu le même article que vous Scoping et levage JavaScript J'ai été confus aussi parce que l'auteur n'a jamais montré comment les deux codes d'exemple d'ouverture sont interprétés dans le compilateur.

Voici l'exemple que vous avez fourni, et le deuxième sur la page :

var a = 1;
function b() {
    function a() {} // declares 'a' as a function, which is always local
    a = 10;
    return;
}
b();
alert(a);

et voici le premier exemple sur la page :

var foo = 1;
function bar() {
    var foo; // a new local 'foo' variable
    if (!foo) {
        foo = 10;
    }
    alert(foo);
}
bar();

J'espère que cela vous aidera

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