Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/434.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javaScript保留关键字_Javascript_Jslint_Reserved Words_Reserved - Fatal编程技术网

javaScript保留关键字

javaScript保留关键字,javascript,jslint,reserved-words,reserved,Javascript,Jslint,Reserved Words,Reserved,我想知道JavaScript的保留关键字/函数是如何管理的 示例: 根据: delete是JavaScript保留的关键字 然后考虑下面的一些上下文片段: var cookieManager = { get: function (name) { // function contents ... console.log("cookieManager.get() called"); return true; }, set:

我想知道JavaScript的保留关键字/函数是如何管理的

示例:

根据:

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()时
FireFox
webconsole
中,我得到以下输出,表明它工作正常:

[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关键字在object cookieManager的上下文中,因此不会引起冲突,因此可以使用它)或者我应该遵守圣经中的
JsLint
,并用javascript重命名任何保留关键字吗?在这种情况下,我可以很容易地将.delete()重命名为.remove()。

实际上,根据允许这样做。对象文字的产生式规则()为:

ObjectLiteral :
    {}
    {PropertyNameAndValueList}
    {PropertyNameAndValueList  ,}

PropertyNameAndValueList :
    PropertyAssignment
    PropertyNameAndValueList , PropertyAssignment

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

PropertyName :
    IdentifierName
    StringLiteral
    NumericLiteral
在本例中,您使用
标识名
作为属性名。说:

保留字是不能用作
标识符的
标识符名称

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


尽管如此,其他(版本的)浏览器可能无法容忍这种情况,因此为了安全起见,我会将其重命名

除了浏览器可能出现的问题外,它还可能会使阅读您的代码但不熟悉此规则的其他人感到困惑


FWIW,当然您可以始终使用保留关键字作为字符串:

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

因此,为了澄清,因为
PropertyName
的产生式规则使用
IdentifierName
而不是
Identifier
,所以可以将
delete
等用作
PropertyName
?@Delan:我会说是的。但这并不意味着浏览器遵循相同的规则。另外,如果您在
严格模式下运行代码,
它会抛出一个errorWow+1,表示我的新事物:)已接受。感谢您对答案的更新,他们提供了一些有用的信息:)