зарезервированные ключевые слова javaScript - PullRequest
7 голосов
/ 23 июля 2011

Мне интересно, как управляются зарезервированные ключевые слова / функции JavaScript.

Пример:

Согласно:

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

delete является зарезервированным ключевым словом JavaScript.

Затем рассмотрим следующий фрагмент для некоторого контекста:

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;
    }
};

Этот объект имеет свойство delete, но его имя зарезервировано JavaScript, поэтому оно должно завершиться ошибкой, верно?

Тем не менее, когда я выполняю cookieManager.delete(); в webconsole из FireFox, я получаю следующий вывод, предполагая, что он работает нормально:

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

Если, однако, вы запускаете код в JsLint, он говорит

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

delete: function (name) { 

Предположение, что это большой нет-нет подход, и его следует избегать.

Поэтому, когда я должен принять во внимание зарезервированные ключевые слова, как в этом примере, кажется, что он работает так, как я хочу (ключевое слово delete находится в контексте объекта cookieManager и, следовательно, не вызывает конфликтов, следовательно, его можно использовать. ) или я должен соблюдать Библию, которая является JsLint и переименовывать все, что является зарезервированным ключевым словом, с помощью javascript? В этом контексте я мог бы легко переименовать .delete () в .remove ().

1 Ответ

8 голосов
/ 23 июля 2011

На самом деле это разрешено согласно спецификации ECMAScript . Производственные правила ( Раздел 11.1.5 ) для литерала объекта:

ObjectLiteral :
    {}
    {PropertyNameAndValueList}
    {PropertyNameAndValueList  ,}

PropertyNameAndValueList :
    PropertyAssignment
    PropertyNameAndValueList , PropertyAssignment

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

PropertyName :
    IdentifierName
    StringLiteral
    NumericLiteral

В вашем случае вы используете IdentifierName в качестве имени свойства. Раздел 7.6.1 говорит:

Зарезервированное слово - IdentifierName, которое нельзя использовать как Identifier.

Обратите внимание на разницу: вы не можете использовать зарезервированное ключевое слово в качестве Идентификатор , но так как оно является действительным IdentifierName , вы можете использовать его как PropertyName .


Тем не менее, другие (версии) браузеров могут не допустить этого, поэтому, чтобы быть в безопасности, я бы переименовал его.

Помимо возможных проблем с браузерами, это также может сбить с толку тех, кто читает ваш код и не знаком с этим правилом.


FWIW, конечно, вы всегда можете использовать зарезервированные ключевые слова в качестве строк:

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