ist das so gewollt (javascript syntax)?

2 Antworten

Das war vermutlich nicht die Absicht vom Erfinder von Javascript, wird aber wegen Rückwärtskompatibilität weiterhin unterstützt.

Die Technik nennt sich übrigens "Monkey Patching".

Woher ich das weiß:Studium / Ausbildung – Informatikstudium
WeissBrot965 
Fragesteller
 03.10.2023, 13:37

Cool hört sich interessant an

0
jo135  03.10.2023, 18:20

JavaScript hat viel von funktionalen Sprachen wie Lisp übernommen, wo das gar nicht ungewöhnlich ist. So ganz unbeabsichtigt war es wohl nicht.

0

Ja, das ist so gewollt bzw. gehört das eben zu Javascript. Im Team bist du mit so was sicherlich sofort der Held und Liebling aller Mitstreiter. Wobei, wenn die ein wenig Ahnung haben, schmeißen die dich schon raus, wenn du auch nur einmal var benutzt hast.

Woher ich das weiß:Berufserfahrung – Entwickle Webseiten seit über 25 Jahren.
WeissBrot965 
Fragesteller
 03.10.2023, 13:28

Was ist denn so schlimm an var?

1
UTGamer  03.10.2023, 13:30
@WeissBrot965

Ist veraltet und unzuverlässig, allgemein komplizierter zu benutzen als let. Gilt allerdings nicht für alle Programmiersprachen!

0
ultrarunner  03.10.2023, 13:31
@WeissBrot965
Was ist denn so schlimm an var?

Dass die damit erzeugten Variablen in der ganzen Funktion gültig sind, und nicht nur im aktuellen Block (geschlungene Klammern).

Angeblich war dies eine der häufigsten Ursachen für Bugs.

2
Babelfish  03.10.2023, 13:32
@WeissBrot965

Genau das, was du festgestellt hast – nämlich, dass var global wirkt – ist das Problem. Deshalb verwendet man fast nur noch const und let, da diese nur im lokalen Scope definiert werden.

2
WeissBrot965 
Fragesteller
 03.10.2023, 13:35
@Babelfish

Hm ok also ich find se super. Hab auch noch nie wirklich ein Problem mit ihnen gehabt. Lässt den Code find ich voll schlecht aussehen wenn überall let var ODER const steht. Mit var ist halt alles einheitlich

1
VeryBestAnswers  03.10.2023, 13:38
@WeissBrot965

Mit 'const' kannst du allerdings sofort erkennen, dass die Variable nicht mehr verändert wird. Das kann sehr nützlich sein.

0
Babelfish  03.10.2023, 13:39
@WeissBrot965

Dann hast du eben noch nicht viel Erfahrung und noch nicht an vielen Javascript-Projekten gearbeitet. Entweder sammelst du mit der Zeit selber die Erfahrungen oder du glaubst einfachmal dem Großteil der erfahrenen Javascript-Entwickler, die aus gutem Grundfast ausschließlich let und const nutzen.

1
WeissBrot965 
Fragesteller
 03.10.2023, 13:46
@Babelfish

Ich glaub es liegt mehr daran, dass ich nie im Team gearbeitet habe. Erfahrung mit js selbst hab ich genug. Deswegen hatte ich auch nie das Problem, dass ausserhalb eine Variable genau so heisst wie in einem scope. Mache das aber so oder so nie, weil ich es einfach komisch finde, wenn 2 zwei, mal irgendwo eine variable deklaliert wird, welche beide genau gleich heißen.

1
Verelat777  03.10.2023, 14:17
@Babelfish

Laut CanIUse verwenden immer noch rund 3 % der Nutzer veraltete Browserversionen, die let nicht unterstützen.

0
Babelfish  03.10.2023, 15:01
@WeissBrot965
Mache das aber so oder so nie, weil ich es einfach komisch finde, wenn 2 zwei, mal irgendwo eine variable deklaliert wird, welche beide genau gleich heißen.

Im Team oder bei größeren Codemengen wirst du Variablen natürlich häufiger gleich benennen. Und genau dann kann es zu schwer auffindbaren Problemen kommen.

Hier mal ein einfaches (und nur leicht konstruiertes) Beispiel:

for (var i = 1; i<=10; i++) {
	var n = i;
	var f = fak(n);

	console.log(`Fakultät von ${n} = ${f}`);
}

function fak(v) {
	n = 1;

	for (var i = 1; i<=v; i++) {
		n = n * i;
	}

	return n;
}

Was würde man als Ergebnis erwarten? Das hier:

Fakultät von 1 = 1
Fakultät von 2 = 2
Fakultät von 3 = 6
Fakultät von 4 = 24
Fakultät von 5 = 120
Fakultät von 6 = 720
Fakultät von 7 = 5040
Fakultät von 8 = 40320
Fakultät von 9 = 362880
Fakultät von 10 = 3628800

Es erscheint aber dieses Ergebnis:

Fakultät von 1 = 1
Fakultät von 2 = 2
Fakultät von 6 = 6
Fakultät von 24 = 24
Fakultät von 120 = 120
Fakultät von 720 = 720
Fakultät von 5040 = 5040
Fakultät von 40320 = 40320
Fakultät von 362880 = 362880
Fakultät von 3628800 = 3628800

Warum? Weil n einen zu globalen Scope hat und in der Funktion fak(v) überschrieben werden kann. Das ist einer der beliebtesten Fehler, der sich in komplexeren Code extrem schwer finden und beheben lässt.

Wie kann man ihn einfach vermeiden? Hiermit:

for (let i = 1; i<=10; i++) {
	const n = i;
	const f = fak(n);

	console.log(`Fakultät von ${n} = ${f}`);
}

Und schon hat die Funktion fak(v) keine Chance in unseren Variablen rumzupfuschen.

0
guteantwort626  03.10.2023, 16:14
@UTGamer

Naja, ich würde nicht sagen, dass es veraltet ist. Ich verwende bei Projekten, die teilweise noch im Internet Explorer laufen müssen immer noch var, und habe damit keine Probleme. Man muss einfach verstehen, was der Unterschied zwischen var und let ist, dann treten auch mit var keine Fehler auf.

0
Babelfish  03.10.2023, 16:26
@guteantwort626

Wer das Pech hat, noch alte Internet Explorer unterstützen zu müssen, der muss dann leider weiter var verwenden. Wie leicht aber schwierig auffindbare Fehler passieren können, habe ich in meinem Beispiel doch gezeigt. Und wenn fak() dann vielleicht noch von einem Teammitglied oder eine externen Bibliothek kommt, dann wird es richtig böse.

0
guteantwort626  03.10.2023, 19:51
@Babelfish
n = 1;

Würde glaube ich so eher nicht vorkommen (bzw. sollte nicht), mit

var n = 1;

tritt das Problem nicht auf.

Ist also schon sehr konstruiert, aber im Grundgedanken stimme ich dir natürlich zu.

0
Babelfish  03.10.2023, 20:10
@guteantwort626

Also n = 1 ohne var finde ich gar nicht konstruiert, zumal solche Zuweisungen früher absolut üblich waren und es Millionen Codes gibt, die so was zumindest vereinzelt nutzen. Ist ja schließlich nicht falsch, sofern man nicht im strict-Mode arbeitet.

0
guteantwort626  03.10.2023, 20:16
@Babelfish

Klar, aber heutzutage doch eher selten, vor allem in Fremd-Bibliotheken. Die sind ja sowieso häufig im strict Mode

0