Pourquoi le deuxième console.log() donne 2, au lieu de 1?

function f() {
    console.log(2);
}

f();

(function() {
    f();
    f = function() {
        console.log(1);
    }
})();
0
Max Wolfen 18 avril 2018 à 01:08

4 réponses

Meilleure réponse

En javascript, les déclarations de fonction sont hissées dans des étendues englobantes, mais les affectations ne le sont pas. Ce que vous avez dans votre deuxième appel n'est pas une déclaration de fonction - vous changez simplement la valeur d'une variable existante. Si vous vouliez une version hissée de f() lors de votre deuxième appel, vous devriez faire quelque chose comme:

function f() {
    console.log(2);
}

f();

(function() {
    f();
    function f() { 
       // this is a function declaration so it will be hoisted to the top
       console.log(1);
    }
})();
3
Mark Meyer 17 avril 2018 à 22:17

En effet, la déclaration de fonction est exécutée deux fois.

FYI - la déclaration de fonction est hissée mais pas l'expression de fonction.

function f() { // function declaration
  console.log(2);
}

f(); // 2

(function() {
  f(); // 2

  f = function() { // function expression
    console.log(1);
  }

  // you can use function expression here now that it is defined
  f(); // 1

})();

// will output:
// 2
// 2
// 1

Lisez:

0
Rahul Desai 17 avril 2018 à 22:28

Le deuxième "console.log (1)" génère 2 car c'est vraiment le premier "console.log (2)" que vous appelez - deux fois. Vous n'avez jamais réellement appelé la fonction qui déclencherait "console.log (1)". Voici un exemple plus représentatif de ce qui se passe:

function f(value) {
    console.log(value);
}

f('a');

(function() {
    f('b');
    f = function() {
        console.log('c');
    }
    // unless you call "f()" at this point, this would not work. The "f = func ... " doesn't get hoisted.
})();

Remarquez comment la sortie est "a" et "b", mais "c" n'est jamais enregistré. Les affectations variables de fonctions ne sont pas hissées, je suppose que vous penseriez que cela se produirait?

J'espère que cela pourra aider.

1
m-a-r-c-e-l-i-n-o 17 avril 2018 à 22:21

Vous appelez f (); dans l'IFEF avant l'expression de votre fonction. Si vous déplacez votre deuxième f (); appelez ci-dessous l'expression, vous obtiendrez le résultat que vous attendez.

function f() {
    console.log(2);
}

f();

(function() {
    f = function() {
        console.log(1);
    }
    f();
})();
1
AWP 17 avril 2018 à 22:15