Javascript - 为什么使用字符串作为函数名称

时间:2015-10-28 10:09:12

标签: javascript dojo

我正在开发一个dojo项目,偶然发现下面的代码:

format: function ( /*Date*/ value, /*locale.__FormatOptions*/ constraints) {
    ....
},

"parse": function ( /*String*/ value, /*locale.__FormatOptions*/ constraints) {
   .....
},

如您所见,解析方法名称是一个字符串。我之前没见过这样的东西。这样做有什么理由吗?

Link to original file

3 个答案:

答案 0 :(得分:1)

根据JavaScript / ECMAScript标准,对象属性(或函数)标识符(在示例中的冒号:之前使用)可以是任何有效 标识符(例如format没有引号),任何字符串(如"parse")甚至任何数字

在这种情况下使用"parse"与使用parse完全等效,但在"parse that value"的情况下会有所不同,myObject.parse是对象的有效字符串标识符属性,即使它有空格!

然后,您可以使用myObject["parse"]myObject["parse that value"]来访问您的媒体资源,而在我的上一个示例中,您别无选择,只能使用for (var i in myObject) { if (i === "parse") { // if i is replaced by the minifier, you will never execute the block below // do something... } } 来访问它。

我认为我们还应该提到一个特定的情况,即使用对象键的引号与不带引号不同:如果您在ADVANCED_OPTIMIZATIONS模式下使用Google Closure minifier,它将替换< / strong>任何未引用的标识符可以尝试节省空间,而它会保留完整的带引号的标识符,因为Google团队将此作为指示符,您将尝试稍后使用方括号方法和字符串访问它,或者如果您检查实际的密钥名称,如下所示:

var httpHeadersToAdd= {
  'User-Agent': 'whatever',
   Date: new Date()
};

这种特殊性迫使您有时使用带引号的标识符(但并非总是如果您不需要保留原始名称)是推动人们不使用此高级优化模式的原因之一。

答案 1 :(得分:0)

我认为没有理由使用额外的报价。

JSON需要它,但你的对象文字不是JSON。 ES3对关键字要求此项,但parse从未成为关键字。

答案 2 :(得分:0)

在这种特殊情况下,没有理由这样做,但我遇到了需要使用引号来定义元素的场景。例如:

User

如果没有引号,解释器会理解您正在尝试使用变量AgentSyntaxError: Unexpected token -进行减法运算,并抛出语法错误var obj= { 'my-function': function (){} } obj['my-function'](); 。可以使用函数进行相同的操作,然后必须使用括号调用它们:

public static class SpanNearQueryDescriptorExtensions 
{
    public static void SpanTermClauses<T>(this SpanNearQueryDescriptor<T> descriptor, Expression<Func<T, object>> field, string[] terms)
        where T : class
    {
        descriptor.Clauses(terms
            .Select(t => new Func<SpanQuery<T>, SpanQuery<T>>(query => query.SpanTerm(field, t)))
            .ToArray());
    }
}

回到你链接的代码,也许有人用JSON-ish的方式写了这个,因为这就是JSON字符串的样子(双引号在JSON中是强制性的,单引号不起作用)