Warum gibt das zweite console.log() 2 anstelle von 1?

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

f();

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

4 Antworten

Beste Antwort

In Javascript werden Funktionsdeklarationen in umschließenden Bereichen gehisst, Zuweisungen jedoch nicht. Was Sie in Ihrem zweiten Aufruf haben, ist keine Funktionsdeklaration - Sie ändern nur den Wert einer vorhandenen Variablen. Wenn Sie bei Ihrem zweiten Anruf eine hochgezogene Version von f() wünschen, müssen Sie Folgendes tun:

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 Apr. 2018 im 22:17

Dies liegt daran, dass die Funktionsdeklaration zweimal ausgeführt wird.

FYI - Funktionsdeklaration wird gehisst, Funktionsausdruck jedoch nicht.

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

Nachlesen:

0
Rahul Desai 17 Apr. 2018 im 22:28

Das zweite "console.log (1)" gibt 2 aus, da es wirklich das erste "console.log (2)" ist, das Sie aufrufen - zweimal. Sie haben nie die Funktion aufgerufen, die "console.log (1)" auslösen würde. Hier ist ein repräsentativeres Beispiel dafür, was passiert:

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.
})();

Beachten Sie, dass die Ausgabe "a" und "b" ist, "c" jedoch nie protokolliert wird. Variable Zuweisungen von Funktionen werden nicht gehisst, ich gehe davon aus, dass Sie gedacht hätten, dass dies passieren würde?

Ich hoffe, das hilft.

1
m-a-r-c-e-l-i-n-o 17 Apr. 2018 im 22:21

Sie rufen f () auf; im IIFE vor Ihrem Funktionsausdruck. Wenn Sie Ihr zweites f () bewegen; Rufen Sie unter dem Ausdruck auf, um das erwartete Ergebnis zu erhalten.

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

f();

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