Frage zum Wiki-Artikel „Funktion“
Rolf B
- frage zum wiki
- javascript
Hallo alle,
der verlinkte Wiki-Artikel sagt, dass dieser Code verboten sei:
if (a > 4) { // Untergeordneter Anweisungsblock beginnt
function berechne(q) { // Nicht erlaubt!
return q*4;
}
} else {
function berechne(q) { // Nicht erlaubt!
return q*7;
}
}
Begründung: Wegen des Hoistings käme es zu einer Namenskollision.
Ich habe das gerade in Chrome probiert, und stelle fest:
Ist das neu in Chrome? Ist das nur in Chrome?
Dass es programmierte Sch... ist, will ich nicht abstreiten.
Rolf
Hallo Rolf,
im Firefox funktioniert es auch.
Gruß
Jürgen
Moin Rolf,
der verlinkte Wiki-Artikel sagt, dass dieser Code verboten sei:
if (a > 4) { // Untergeordneter Anweisungsblock beginnt function berechne(q) { // Nicht erlaubt! return q*4; } } else { function berechne(q) { // Nicht erlaubt! return q*7; } }
Begründung: Wegen des Hoistings käme es zu einer Namenskollision.
Ich habe das gerade in Chrome probiert, und stelle fest:
- die Funktion wird nicht vor die geschweifte Klammer gehoben, in der sie definiert ist
- Die Funktion ist hinter der geschweiften Klammer, in der sie definiert wurde, immer noch sichtbar (d.h. wird korrekt im function scope definiert und nicht lokal im Anweisungsblock)
- abhängig vom Wert von a steht beim Aufruf der passende Funktionsbody zur Verfügung.
Ist das neu in Chrome? Ist das nur in Chrome?
In Firefox sieht es genau so aus.
Ich erkläre mir das so, dass der obige Code äquivalent ist zu
if (a < 4) {
var berechne = function(q) {
return q*4;
}
} else {
var berechne = function(q) {
return q * 8;
}
}
Viele Grüße
Robert
Hallo Robert,
ja, ist er. Und ich würde das gerne gegen den IE regressionstesten. Aber mittlerweile weigert sich Windows bei mir, den IE auch nur zu starten und poppt mir nur noch ein Edge-Tab auf, wenn ich den starten will 😕
Rolf
Moin Rolf,
Und ich würde das gerne gegen den IE regressionstesten.
der macht das Gleiche.
Viele Grüße
Robert
Hallo Robert,
so, Regressionstest gelungen. Der IE11 macht das Gleiche. Aber nur der.
Der IE10 hoistet die Funktion im else Teil ganz nach oben.
if (foo)
console.log(foo());
var a = 6;
if (a > 4) {
function foo() { return "über 4"; }
}
else {
function foo() { return "Muh"; }
}
console.log(foo());
Wenn ich den IE11 in den IE10 Mode schalte, gibt er zweimal "Muh" aus. Im IE11 Mode gibt er einmal "über 4" aus. Da scheint mit irgendeiner ECMAScript-Version etwas geändert worden zu sein.
Rolf
Moin Rolf,
so, Regressionstest gelungen. Der IE11 macht das Gleiche. Aber nur der.
Der IE10 hoistet die Funktion im else Teil ganz nach oben.
wie kommt man denn noch an so einen Internet Explorer?
Viele Grüße
Robert
Hallo,
Der IE10 hoistet die Funktion im else Teil ganz nach oben.
wie kommt man denn noch an so einen Internet Explorer?
vielleicht auf einem alten Rechner, der noch mit Windows 7 bestückt ist und schon lange keine Updates mehr bekommt?[1] Oder in einer eigens für solche Zwecke eingerichteten VM?
Wobei ... ich vermute, dass es schwierig ist, jetzt noch gezielt eine bestimmte alte IE-Version irgendwo zum Download zu finden.
Einen schönen Tag noch
Martin
Ich kenne jemanden, der sogar noch XP aktiv nutzt, weil eine teure CAD-Software, die er für die Arbeit braucht, auf neueren Windowsen nicht mehr laufen will. ↩︎
Wobei ... ich vermute, dass es schwierig ist, jetzt noch gezielt eine bestimmte alte IE-Version irgendwo zum Download zu finden.
Hallo Robert,
der ist auf meinem Windows 10 noch dabei. Im Internet Explorer 11 versteckt - muss man in den DevTools einschalten.
Rolf