javaScript保留关键字

时间:2011-07-23 09:39:16

标签: javascript jslint reserved-words reserved

我想知道如何管理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();的{​​{1}}中执行webconsole时,我得到以下输出,表明它工作正常:

FireFox

但是,如果您在[11:26:00.654] cookieManager.delete(); [11:26:00.656] cookieManager.delete() called [11:26:00.657] true 中运行代码

JsLint

建议这是一个很大的 no no 方法,应该避免使用。

所以我什么时候应该考虑保留关键字,因为在这个例子中,它似乎就像我想要的那样工作(delete关键字在对象cookieManager的上下文中,因此不会产生冲突,因此可以使用它或者我应该遵守Problem at line 12 character 5: Expected an identifier and instead saw 'delete' (a reserved word). delete: function (name) { 的圣经并通过javascript重命名任何保留关键字?在这种情况下,我可以轻松地将.delete()重命名为.remove()。

1 个答案:

答案 0 :(得分:8)

实际上这是ECMAScript specification所允许的。对象文字的生产规则(Section 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作为属性名称。 Section 7.6.1说:

  

保留字是IdentifierName,不能用作Identifier

请注意区别:您不能将保留关键字用作标识符,但由于它是有效的标识符名称,您可以将其用作 PropertyName


然而,其他(版本的)浏览器可能不会容忍这种情况,所以为了安全起见,我会重命名它。

除了浏览器可能存在的问题之外,它还可能会使阅读代码并且不熟悉此规则的其他人感到困惑。


FWIW,当然你总是可以使用保留的关键字作为字符串:

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