2011-12-20 10 views
6

Usiłuję minify osobie trzeciej JavaScript biblioteki za pomocą Google Closure Compiler, ale błędy się w wierszu poniżej:javascript pakiet, jest zarezerwowanym kluczowe

inBlock.package = package = name 

Błąd znajduje

ERROR - Błąd przetwarzania. brakujące imię po. operator **

name powyżej jest lokalną zmienną wewnątrz funkcji, a inBlock jest argumentem wejściowym. Nigdzie w funkcji nie jest zadeklarowany inny niż ten wiersz błędu.

Przypuszczam, że to może być spowodowane package jest zastrzeżonym słowem kluczowym w JavaScript? Każdy pomysł, jaki pakiet jest w JavaScript i jak go naprawić?

Odpowiedz

7

masz rację package to słowo zarezerwowane w JavaScript (ale tylko w trybie ścisłym, dlatego kod działa w niektórych miejscach).

package jest zarezerwowana na przyszłość, co oznacza, że ​​nie jest do niczego używana, ale nie można jej użyć do nazwania zmiennych. Jednak (jeśli naprawdę musisz), możesz go użyć do nazwania kluczy w obiektach takich jak ten:

inBlock['package'] = name; // this is ok 

Tak długo, jak używasz napisu. Nie możesz tego zrobić:

inBlock.package = name; // this is not ok 

Powiedziałbym, że lepiej jest nazwać to coś innego.

+0

Nie musisz jednak używać składni nawiasów. [jsFiddle] (http://jsfiddle.net/4Lpyw/) @nnnnnn – Ryan

+0

To może działać u niektórych tłumaczy, ale jest nielegalne (JavaScript: The Good Parts, strona 103 - może sprawdzić standard, jeśli chcesz). –

+0

Och, nie wiedziałem tego. Cóż, działa w każdej przeglądarce, którą mogę przetestować przynajmniej :) – Ryan

1

package jest słowem kluczowym (z Javy) zarezerwowanym do późniejszego wykorzystania w JavaScript. Rozwiązanie? Nazwij zmienną coś innego :)

Jeśli nie można zmienić nazwę inBlock.package, do niego dostęp za pomocą notacji wspornik zamiast:

inBlock['package'] 
1

Zgodnie z MDN, package należy do kategorii "Zarezerwowane dla przyszłości". W zależności od wersji przeglądarki, której używasz i od tego, czy Twój kod jest w trybie ścisłym, możesz lub nie możesz używać tych słów jako identyfikatorów. Innymi słowy, należy ich unikać, aby były bezpieczne. jeśli używasz tej składni

Ty może bezpiecznie korzystać słów zastrzeżonych jako nazw własności:

inBlock["package"] = something; 

Ale to nie pomoże ci w zmiennej package. Czy potrafisz zmienić nazwę?

2

"Pakiet" jest słowem zastrzeżonym w ecmascript 3. ecmascript 5 zmniejszył zarezerwowany zestaw słów, czyniąc go dostępnym dla przeglądarki, która go zaimplementowała, i wprowadził go ponownie w trybie ekstatycznym 5 "ścisłym" (który ma być podstawą przyszłe wersje emcascript).

Ecmascript 5 również zmienił ograniczenia nałożone na słowa zastrzeżone, w szczególności można użyć słów zarezerwowanych jako nazw właściwości (niezależnie od trybu), ale nie nazw zmiennych.

W rezultacie, jeśli umieścisz Kompilator zamykania w trybie EcmaScript 5, możesz użyć "inBlock.package" i nie będzie narzekać, ale jeśli użyjesz go spróbuj użyć go w starszych wersjach IE (8,7,6 Wierzę), że nie uda się go sparsować. Większość innych przeglądarek nie przestrzegała tej części specyfikacji i nie ma na nią wpływu.