为什么JavaScript解析器接受JSON作为函数体?

时间:2014-11-07 08:52:11

标签: javascript json

前几天,我遇到了一些奇怪的代码:

var OrderSupplement = function() {
      oid: null;
      code: "";
      description: "";
      startdate: "";
      enddate: "";
      gender: null;
      cardowner: null;
      box: null;
      divisor: 0;
      created: null;
      createdBy: "";
};

代码的意图对我来说很明确:尝试定义构造函数,以便创建 OrderSupplement 实例

我对这种语法感到困惑。

编写代码的伙伴表示它工作正常 - 虽然显然不是;至少它不应该是什么。他实例化了 OrderSupplement 的新实例并设置了例如 oid nonnull 值并稍后检索它。当然,在设置之前检索一个值会揭示错误。

上面代码的效果如下:

var OrderSupplementJson = function() {}

我的问题是:

为什么上面的代码接受并且不会抛出任何类型的(语法)错误?

2 个答案:

答案 0 :(得分:13)

因为oid:定义了label

它在语法上是正确的,但没有任何有用的东西。这显然是一个错误。

答案 1 :(得分:4)

解释说键被解析为标签的答案是正确的,但我只是想纠正问题的前提。

这不是JSON语法。 JSON使用,来分隔值,这使用;。 JSON要求引用所有字符串键,这不引用它们(它在标签中无效)。

但是,我可能知道作者是如何想出这个的。虽然JavaScript没用,但是这个语法可以用来定义一个在CoffeeScript中返回Object literal 的函数

以下CoffeeScript:

OrderSupplement = ->
      oid: null;
      code: "";
      description: "";
      startdate: "";
      enddate: "";
      gender: null;
      cardowner: null;
      box: null;
      divisor: 0;
      created: null;
      createdBy: "";

Compiles to以下JavaScript:

var OrderSupplement;

OrderSupplement = function() {
  return {
    oid: null,
    code: "",
    description: "",
    startdate: "",
    enddate: "",
    gender: null,
    cardowner: null,
    box: null,
    divisor: 0,
    created: null,
    createdBy: ""
  };
};

您可能还会感兴趣的是,您可以通过their non-standard "expression closures" lambda function syntax了解类似的内容在Firefox中也有效。

var OrderSupplement = function() ({
      oid: null,
      code: "",
      description: "",
      startdate: "",
      enddate: "",
      gender: null,
      cardowner: null,
      box: null,
      divisor: 0,
      created: null,
      createdBy: ""
});