Javascript - 为什么使用字符串作为函数名
Javascript - Why use string as function name
我正在做一个 dojo 项目,无意中发现了下面的代码:
format: function ( /*Date*/ value, /*locale.__FormatOptions*/ constraints) {
....
},
"parse": function ( /*String*/ value, /*locale.__FormatOptions*/ constraints) {
.....
},
如您所见,解析方法名称是一个字符串。我以前从未见过这样的事情。这样做有什么理由吗?
我看不出有任何理由使用额外的引号。
JSON 需要它,但您的对象文字不是 JSON。 ES3 要求关键字使用这个,但 parse
从来都不是关键字。
根据 JavaScript / ECMAScript 标准,对象 属性(或函数)标识符(在您的示例中冒号 :
之前使用)可以是任何 valid identifier(即像不带引号的 format
),任何 string(像 "parse"
)甚至任何 number.
在这种情况下使用 "parse"
与使用 parse
严格等效,但在 "parse that value"
的情况下会有所不同,它是一个有效的字符串标识符对象 属性,即使它有 spaces!
然后您可以使用 myObject.parse
或 myObject["parse"]
来访问您的 属性,而在我的最后一个示例中,您别无选择,只能使用 myObject["parse that value"]
来访问它。
我认为我们还应该提到一个特定的情况,其中对对象键使用引号与 不使用 引号不同:如果您要在 ADVANCED_OPTIMIZATIONS 模式,它将 替换 任何非引号标识符以尝试保存 space,而它会保留完整的引号标识符,正如 Google 团队采用的那样这表明您稍后将尝试使用方括号方法和字符串访问它,或者如果您像这样检查实际的键名:
for (var i in myObject) {
if (i === "parse") { // if i is replaced by the minifier, you will never execute the block below
// do something...
}
}
这种强制您有时使用带引号的标识符的特殊性(但并非总是如此,如果您不需要保留原始名称)是促使人们不使用这种高级优化模式的原因之一。
在这种特殊情况下,没有理由这样做,但我遇到过需要使用引号来定义元素的情况。例如:
var httpHeadersToAdd= {
'User-Agent': 'whatever',
Date: new Date()
};
没有引号,解释器会理解您正在尝试对变量 User
和 Agent
进行减法运算,并抛出语法错误 SyntaxError: Unexpected token -
。同样可以用函数来做,然后你必须用括号调用它们:
var obj= {
'my-function': function (){}
}
obj['my-function']();
回到您链接的代码,也许有人以 JSON 左右的方式编写了它,因为这就是 JSON 字符串的样子(双引号在 JSON 中是强制性的,单引号不起作用)
我正在做一个 dojo 项目,无意中发现了下面的代码:
format: function ( /*Date*/ value, /*locale.__FormatOptions*/ constraints) {
....
},
"parse": function ( /*String*/ value, /*locale.__FormatOptions*/ constraints) {
.....
},
如您所见,解析方法名称是一个字符串。我以前从未见过这样的事情。这样做有什么理由吗?
我看不出有任何理由使用额外的引号。
JSON 需要它,但您的对象文字不是 JSON。 ES3 要求关键字使用这个,但 parse
从来都不是关键字。
根据 JavaScript / ECMAScript 标准,对象 属性(或函数)标识符(在您的示例中冒号 :
之前使用)可以是任何 valid identifier(即像不带引号的 format
),任何 string(像 "parse"
)甚至任何 number.
在这种情况下使用 "parse"
与使用 parse
严格等效,但在 "parse that value"
的情况下会有所不同,它是一个有效的字符串标识符对象 属性,即使它有 spaces!
然后您可以使用 myObject.parse
或 myObject["parse"]
来访问您的 属性,而在我的最后一个示例中,您别无选择,只能使用 myObject["parse that value"]
来访问它。
我认为我们还应该提到一个特定的情况,其中对对象键使用引号与 不使用 引号不同:如果您要在 ADVANCED_OPTIMIZATIONS 模式,它将 替换 任何非引号标识符以尝试保存 space,而它会保留完整的引号标识符,正如 Google 团队采用的那样这表明您稍后将尝试使用方括号方法和字符串访问它,或者如果您像这样检查实际的键名:
for (var i in myObject) {
if (i === "parse") { // if i is replaced by the minifier, you will never execute the block below
// do something...
}
}
这种强制您有时使用带引号的标识符的特殊性(但并非总是如此,如果您不需要保留原始名称)是促使人们不使用这种高级优化模式的原因之一。
在这种特殊情况下,没有理由这样做,但我遇到过需要使用引号来定义元素的情况。例如:
var httpHeadersToAdd= {
'User-Agent': 'whatever',
Date: new Date()
};
没有引号,解释器会理解您正在尝试对变量 User
和 Agent
进行减法运算,并抛出语法错误 SyntaxError: Unexpected token -
。同样可以用函数来做,然后你必须用括号调用它们:
var obj= {
'my-function': function (){}
}
obj['my-function']();
回到您链接的代码,也许有人以 JSON 左右的方式编写了它,因为这就是 JSON 字符串的样子(双引号在 JSON 中是强制性的,单引号不起作用)