2011-07-23 19 views
7

Zastanawiam się, jak zarządzane są zastrzeżone słowa kluczowe/funkcje JavaScript.Zarezerwowane słowa kluczowe javaScript

Przykład:

Według:

http://www.quackit.com/javascript/javascript_reserved_words.cfm

delete jest zarezerwowanym kluczowe przez JavaScript.

Następnie należy rozważyć następujący fragment z jakiegoś kontekstu:

var cookieManager = { 
    get: function (name) { 
     // function contents ... 
     console.log("cookieManager.get() called"); 
     return true; 
    }, 
    set: function (name, value, days) { 
     // function contents ... 
     console.log("cookieManager.set() called"); 
     return true; 
    }, 
    delete: function (name) { 
     // function contents ... 
     console.log("cookieManager.delete() called"); 
     return true; 
    } 
}; 

Ten obiekt ma właściwość delete, ale nazwa jest on zarezerwowany przez JavaScript więc powinien zawieść, prawda?

Jednak kiedy wykonać cookieManager.delete(); w webconsole z FireFox uzyskać następujące dane wyjściowe, co sugeruje, że działa prawidłowo:

[11:26:00.654] cookieManager.delete(); 
[11:26:00.656] cookieManager.delete() called 
[11:26:00.657] true 

Jeśli jednak uruchomić kod w JsLint mówi

Problem at line 12 character 5: Expected an identifier and instead saw 'delete' (a reserved word). 

delete: function (name) { 

Sugerując, że jest to podejście szerokie, należy unikać takich sytuacji.

Więc kiedy wziąć pod uwagę zarezerwowane słowa kluczowe, tak jak w tym przykładzie, wydaje się, że działa tak, jak tego chcę (słowo kluczowe "usuń" znajduje się w kontekście obiektu cookieManager i dlatego nie powoduje konfliktów, dlatego może być używane), czy też powinienem stosować się do Biblii, która jest JsLint i zmienić nazwę wszystkiego, co jest zastrzeżonym słowem kluczowym przez javascript? W tym kontekście mogłem łatwo zmienić nazwę .delete() na .remove().

Odpowiedz

8

W rzeczywistości jest to dozwolone zgodnie z ECMAScript specification. Zasady produkcji (Section 11.1.5) dla obiektu dosłownym są:

ObjectLiteral : 
    {} 
    {PropertyNameAndValueList} 
    {PropertyNameAndValueList ,} 

PropertyNameAndValueList : 
    PropertyAssignment 
    PropertyNameAndValueList , PropertyAssignment 

PropertyAssignment : 
    PropertyName : AssignmentExpression 
    get PropertyName (){FunctionBody} 
    set PropertyName (PropertySetParameterList){FunctionBody} 

PropertyName : 
    IdentifierName 
    StringLiteral 
    NumericLiteral 

W Twoim przypadku korzystania z IdentifierName jako nazwy właściwości. Section 7.6.1 mówi:

słowo zarezerwowane jest IdentifierName że nie może być stosowany jako Identifier.

zauważyć różnicę: Nie można używać zastrzeżonego słowa kluczowego jako Identifier, ale ponieważ jest to ważny IdentifierName można go używać jako propertyName.


Mimo to inne (wersje) przeglądarek mogą tego nie tolerować, więc aby zachować bezpieczną stronę, zmieniłbym nazwę.

Poza możliwymi problemami z przeglądarkami, może również mylić innych, którzy czytają Twój kod i nie znają tej reguły.


FWIW Oczywiście zawsze można użyć słów kluczowych zastrzeżonych jako ciągi:

var a = {'delete': 'foo'}; 
alert(a['delete']); 
+0

Tak więc, aby wyjaśnić, ponieważ zasada produkcja '' IdentifierName' PropertyName' korzysta i nie 'Identifier', to dobrze używać 'delete' i tak dalej jako' PropertyName'? –

+0

@Delan: Powiedziałbym tak. Nie oznacza to jednak, że przeglądarki stosują tę samą zasadę. –

+0

Również, jeśli uruchomisz kod w '' trybie ścisłym' 'powinien on rzucić błąd – Raynos

Powiązane problemy