我想知道如何管理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()。
答案 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']);