8

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 によって予約されているため、失敗するはずですよね?

しかし、 of で実行するcookieManager.delete();webconsoleFireFox次の出力が得られ、正常に動作することが示唆されます。

[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) { 

これは大きなノーノーアプローチであり、避けるべきであることを示唆しています。

したがって、いつ予約済みキーワードを考慮に入れる必要がありますか?私は聖書を守り、JsLintjavascript によって予約されたキーワードの名前を変更しますか? このコンテキストでは、.delete() の名前を .remove() に簡単に変更できます。

4

1 に答える 1

9

実際、これは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

あなたの場合、 IdentifierNameas プロパティ名を使用します。セクション 7.6.1は次のように述べています。

予約語は、IdentifierNameとして使用できないIdentifierです。

違いに注意してください。予約済みのキーワードをIdentifierとして使用することはできませんが、これは有効なIdentifierNameであるため、 PropertyNameとして使用できます。


それにもかかわらず、他の (バージョンの) ブラウザーはこれを許容しない可能性があるため、念のため、名前を変更します。

ブラウザで起こりうる問題とは別に、コードを読んでこのルールに慣れていない他の人を混乱させる可能性もあります。


FWIW、もちろん、予約済みのキーワードを文字列としていつでも使用できます。

var a = {'delete': 'foo'};
alert(a['delete']);
于 2011-07-23T09:50:31.973 に答える