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 保留的,所以它应该会失败,对吧?

然而,当我执行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) { 

建议这是一个很大的禁忌方法,应该避免。

所以我什么时候应该考虑保留关键字,就像在这个例子中它似乎像我想要的那样工作(删除关键字在对象 cookieManager 的上下文中,因此不会导致冲突,因此可以使用它)或者应该我遵守圣经JsLint并重命名javascript保留关键字的任何内容?在这种情况下,我可以轻松地将 .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 回答