2017-06-29 17 views
8

Co dzieje się z literałami JavaScript (ciągi, liczby), które nie są powiązane (przypisywane) do zmiennej?Co dzieje się z niezwiązanymi literałami JavaScript?

// A comment 
"Practically, also a comment" 
var assigned = "something" 
53 
423.0022 
NaN 
"does it impact performance" 
// or is it treated just like a comment? 

Przeglądarka wydaje się je ignorować, ale nie mogłem znaleźć konkretną regułę w spec

+1

Dla odniesienia: [Wyrażenie wypowiedzi] (http://www.ecma-international.org/ecma-262/6.0/# sec-expression-statement) –

+0

Nie podążam za ES3.1, ale muszę dodać tryb ścisły (jest wykrywany przez literał String wewnątrz instrukcji wyrażenia przy okazji) – Hydro

+0

Jest prawdopodobne, że silniki JS w świecie rzeczywistym zoptymalizują poza "nieużywanymi" wyrażeniami, które nie mają skutków ubocznych. – joews

Odpowiedz

8

Są to "wyrażenia wyrażeń". Wyrażenia takie są oceniane, ale ponieważ nie są przypisane, ich wartość nie jest przechowywana. Silniki JavaScript mogą wykryć te, które nie mają skutków ubocznych, i wyeliminować je tak, jakby nigdy nie istniały.

Ale jeszcze co najmniej jeden z nich ma wpływ:

"use strict"; 

To ma sens JavaScript directive

Z EcmaScript specification:

A Za pomocą Strict dyrektywa jest ExpressionStatement w Prologu dyrektywy, którego StringLiteral jest ei dokładne sekwencje jednostek kodu "use strict" lub 'use strict'.

Należy również pamiętać, że inne literały łańcuchowe może mają szczególne znaczenie, gdy używane w dyrektywie prologu:

implementacje mogą definiować specyficzne znaczenie wdrożeniowe dla ExpressionStatement produkcje, które nie stanowią use strict dyrektywa i które występują w Prologu dyrektywy.

+0

To jest dosłowne stwierdzenie dyrektywy, a nie wyrażenie literowe - spróbuj wprowadzić je w https://astexplorer.net/ – joews

+0

Zwróć uwagę, że tryb ścisły został dodany od czasu ES3.1: http://jaoo.dk/dl/jaoo -aarhus-2008/slajdy // PratapLakshman_ECMAScript31.pdf (po ES4) – Hydro

+1

@joews, myślę, że to kwestia wyboru słowa. Specyfikacja EcmaScript mówi o tym jako o słowie kluczowym wyrażenia expression w prologu dyrektywy. – trincot

6

to tylko expression statement który ocenia - bez skutków ubocznych - do wartości, która jest odrzucany.

Możesz zobaczyć, że jest wynikiem oświadczenia, jeśli spróbujesz to w eval lub REPL.

0

Ponieważ wartość nie jest zapisywana (tzn. Nie ma miejsca na przechowywanie Twojego literału), jest ona mniej lub bardziej ignorowana przez przeglądarkę, a także nie ma narzutu dla śmieciarza. Przynajmniej funkcja twojego kodu się nie zmienia. Twój plik javascript będzie oczywiście trochę większy, ponieważ zawiera więcej (bezużyteczny) tekst.

0

Wygląda na to, że traktują je jako zmienne wstawiane do niczego. Traktuje je tak, jakby i tak nie istniały. Spróbuj go:

function myFunction() { 
 
    "comment" 
 
    //Or comment 
 
    alert("hello"); 
 
}
<html> 
 

 
<body> 
 
    <button onclick="myFunction()">Call Javascript</button> 
 
</body> 
 

 
</html>

Jak widać, nic się nie dzieje, gdy pusta struna ma. To interesujące pytanie, więc byłbym bardzo zainteresowany słuchaniem jakichkolwiek innych wyników.

1

Wartości są przechowywane w pamięci, dopóki nie zostaną oczyszczone przez moduł czyszczenia pamięci, ponieważ nic nie wskazuje tego miejsca w pamięci.

+0

Nie sądzę, że śmieciarz jest w to zaangażowany. Czy masz na to referencję? Wydaje mi się, że pamięć użyta do oceny wyrażenia jest natychmiast zwalniana, jeśli w ogóle silnik wygenerował kod bajtu. – trincot

Powiązane problemy