前几天,我遇到了一些奇怪的代码:
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() {}
我的问题是:
为什么上面的代码接受并且不会抛出任何类型的(语法)错误?
答案 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: ""
});