0

在 dojo 1.9 源代码中,dijit/nls/common.js 我看到了这个

define({ root:    
({
    buttonOk: "OK",
    buttonCancel: "Cancel",
    buttonSave: "Save",
    itemClose: "Close"
})

//etc

为什么作者使用

( { /*data*/ } ) 

构造?这实际上意味着什么?为什么 {} 不够?() 大概是对表达式进行定界,但为什么有必要这样做呢?

4

1 回答 1

1

我认为在那个特定的例子中没有任何理由。

但在某些情况下...

(请注意,如果对象出现在预期语句的位置,您可能需要将对象字面量括在括号中,以免字面量与块语句混淆。)

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects

eval()可能与它有关,但在您的特定示例中,JS 解析器应该处理代码并且不应该使用eval().

例如(无括号):

SyntaxError: invalid label

eval("{a:1, b:2}")

和(带括号):

>>> eval("({a:1, b:2})")
Object { a=1, b=2}

也许它与Dojo的构建过程有关,并且NLS模块被重新格式化为需要括号?似乎不太可能,因为这似乎很脆弱,并且构建过程本身可以很容易地添加括号。


编辑:我刚刚在 GitHub 上查看了这个文件的历史。

原始版本(在 GitHub - https://github.com/dojo/dijit/blob/11f94ad6cebba102b8411ed1a67e35aed94a97bb/nls/common.js中)如下所示:

({
    buttonOk: "OK",
    buttonCancel: "Cancel",
    buttonSave: "Save",

    notSet: "Not set",
    left: "Left",
    right: "Right",
    center: "Center",
    middle: "Middle",
    top: "Top",
    bottom: "Bottom",

    //units
    unitPixel: "pixels",
    unitPercent: "percent",
    width: "Width",
    height: "Height"
})

所以我猜这个文件最初是eval'd,括号在历史上是必要的,但随着转向 AMD 变得有些多余。

当然可能是错的!

于 2013-06-23T09:56:55.257 回答