7

我知道这delete是 JavaScript 中的一个关键字。所以我有这个代码(例如):

var user = {
   create : function () {
       // Create a user account
   },

   delete : function () {
       // Delete a user account
   }
};

上述工作(除非是旧版本的 IE),所以我的问题是 - 这是一个好主意。显然,user.delete();对于使用代码的人来说,调用比类似的更清晰user.delete_one();

显然关键字很重要,但根据具体情况,使用这种方法可以(当然我不需要旧版 IE 支持),还是有更好的解决方案?

4

4 回答 4

8

你可以这样做:

var user = {
   create : function () {
       // Create a user account
   },

   'delete' : function () {
       // Delete a user account
   }
};

或者使用双引号"

于 2012-10-11T13:26:50.833 回答
5

不要试图覆盖关键字。IMO 这是一种不好的做法,并且会让其他开发人员感到非常困惑。您可以简单地将其重命名为remove

于 2012-10-11T13:28:43.110 回答
3

您的代码将按预期工作,因为您没有覆盖 JS 关键字。如果您尝试将关键字声明为变量或函数名,JS 将显示错误SyntaxError: Unexpected token delete

你选择的方式没问题,但不要直接覆盖JS关键字。

于 2012-10-11T13:31:39.013 回答
2

当您使用对象文字时,属性名称可以是以下任何一种:

IdentifierName
StringLiteral
NumericLiteral

StringLiteral并且NumericLiteral应该清楚。究竟是什么IdentifierName

让我们看一下规范的第 7.6 节

IdentifierName ::
     IdentifierStart
     IdentifierName *IdentifierPart*

IdentifierStart ::
     UnicodeLetter
     $
     _
     \ UnicodeEscapeSequence

IdentifierPart ::
     IdentifierStart
     UnicodeCombiningMark
     UnicodeDigit
     UnicodeConnectorPunctuation
     <ZWNJ>
     <ZWJ>

所以,IdentifierName真的是如上所述的任何字符序列。是否是保留字无关紧要。

可用于变量和函数名称的名称称为Identifiers 并定义为:

标识符 ::
     IdentifierName但不是ReservedWord

您会看到,保留字被明确排除为标识符的可能性,但不适用于对象属性。

但是,您永远不知道解析器有多“好”以及它是否遵守所有规则。此外,诸如 JSHint 之类的 linting 工具通常会警告您使用了保留关键字,尽管它是有效的。为了安全起见,您应该将这些词放在引号中,甚至使用括号符号来访问它:

var foo = {'delete': ... }
foo['delete'] = ....;

如果这太麻烦,请不要使用保留字作为属性名称。例如delete,您可以使用代替remove

于 2013-02-15T10:42:30.813 回答