Dlaczego poniższe fragmenty kodu zaczerpnięte z tego artykułu dają różne wyniki z powodu tylko jednej zmiany w umiejscowieniu nawiasów klamrowych?
Gdy otwór nawias klamrowy {
jest w nowej linii, test()
powraca undefined
, i „nie - złamał: niezdefiniowane” wyświetlany jest w pogotowiu.
function test()
{
return
{ /* <--- curly brace on new line */
javascript: "fantastic"
};
}
var r = test();
try {
alert(r.javascript); // does this work...?
} catch (e) {
alert('no - it broke: ' + typeof r);
}
Kiedy nawias znajduje się w tym samym wierszu, co return
, test()
zwraca obiekt i ostrzega o „fantastycznym”.
function test()
{
return { /* <---- curly brace on same line */
javascript: "fantastic"
};
}
var r = test();
try {
alert(r.javascript); // does this work...?
} catch (e) {
alert('no - it broke: ' + typeof r);
}
javascript
syntax
JustLearn
źródło
źródło
return
jest nieco inna niż w innych miejscach, a podział wiersza „oznacza więcej” w tym miejscu niż „w środku strumienia”.Odpowiedzi:
To jedna z pułapek JavaScript: automatyczne wstawianie średników. Wiersze, które nie kończą się średnikiem, ale mogą być końcem instrukcji, są automatycznie kończone, więc pierwszy przykład wygląda tak efektywnie:
Zobacz także przewodnik po stylu JS Douglasa Crockforda , w którym wspomina się o wstawianiu średników.
W drugim przykładzie zwracasz obiekt (zbudowany za pomocą nawiasów klamrowych) z właściwością
javascript
i jej wartością"fantastic"
, w rzeczywistości taką samą jak ta:źródło
return /*
a następnie*/{
skutecznie komentowałoby ukryty średnik w starszych wersjach Chrome. Nie jestem pewien, czy to nadal obowiązujeJavascript nie wymaga średników na końcu instrukcji, ale wadą jest to, że musi odgadnąć, gdzie są średniki. W większości przypadków nie stanowi to problemu, ale czasami tworzy średnik w miejscu, w którym nie było to zamierzone.
Przykład z mojego wpisu na blogu na ten temat ( Javascript - prawie nie oparty na wierszach ):
Jeśli sformatujesz kod w ten sposób:
Następnie jest interpretowany w następujący sposób:
Instrukcja return przyjmuje postać bez parametrów, a argument staje się własną instrukcją.
To samo dzieje się z Twoim kodem. Funkcja jest interpretowana jako:
źródło
Osobiście wolę styl Allman ze względu na czytelność (w porównaniu do stylu K&R).
Zamiast…
Podoba mi się…
Ale to obejście. Ale mogę z tym żyć.
źródło
Dzieje się tak, ponieważ javascript najczęściej umieszcza „;” na końcu każdej linii, więc po prostu, gdy masz return {w tej samej linii, silnik javascript widzi, że będzie coś więcej, a kiedy jest w nowej linii, myśli, że zapomniałeś wstawić ";", i umieszcza to za ciebie.
źródło
Nawiasy klamrowe wskazują tutaj budowę nowego obiektu. Zatem twój kod jest równoważny z:
który działa, a jeśli napiszesz:
to już nie działa.
źródło
Problemem jest w istocie wstrzyknięcie średnika, jak opisano powyżej. Właśnie przeczytałem dobry wpis na blogu na ten temat. Wyjaśnia ten problem i wiele więcej na temat javascript. Zawiera również dobre referencje. Możesz to przeczytać tutaj
źródło