Ответ 1
Потому что oid:
определяет label.
Он синтаксически исправляет, но не имеет ничего полезного. Это, очевидно, ошибка.
На днях я наткнулся на какой-то странный код:
var OrderSupplement = function() {
oid: null;
code: "";
description: "";
startdate: "";
enddate: "";
gender: null;
cardowner: null;
box: null;
divisor: 0;
created: null;
createdBy: "";
};
Цель кода была понятна мне: это была попытка определить функцию-конструктор, чтобы создать экземпляр OrderSupplement.
Я сбив с толку этим синтаксисом.
Приятель, написавший код, сказал, что он работает нормально - хотя, очевидно, это не так; по крайней мере, это не то, что нужно. Он создал экземпляр OrderSupplement и установил, например. oid к ненулевому значению и позже его получить. Разумеется, извлечение значения перед настройкой показало бы ошибку.
Эффект приведенного выше кода выглядит следующим образом:
var OrderSupplementJson = function() {}
Мой вопрос:
Почему код выше принят и не генерирует (синтаксическую) ошибку любого типа?
Потому что oid:
определяет label.
Он синтаксически исправляет, но не имеет ничего полезного. Это, очевидно, ошибка.
Ответ, объясняющий, что ключи обрабатываются как метки корректно, но я просто хотел исправить предпосылку вопроса.
Это не синтаксис JSON. JSON использует ,
для разграничения значений, это использует ;
. JSON требует, чтобы все строковые ключи были процитированы, это не цитирует их (это было бы недопустимо в ярлыках).
Однако, я знаю, как автор придумал это. Этот бесполезный JavaScript, как и JavaScript, может использоваться для определения функции, возвращающей литерал Object в CoffeeScript!
Следующий CoffeeScript:
OrderSupplement = ->
oid: null;
code: "";
description: "";
startdate: "";
enddate: "";
gender: null;
cardowner: null;
box: null;
divisor: 0;
created: null;
createdBy: "";
Скомпилирует следующий JavaScript:
var OrderSupplement;
OrderSupplement = function() {
return {
oid: null,
code: "",
description: "",
startdate: "",
enddate: "",
gender: null,
cardowner: null,
box: null,
divisor: 0,
created: null,
createdBy: ""
};
};
Вам также может быть интересно узнать, что что-то совсем похожее также работает в Firefox через их нестандартные синтаксисы лямбда-функций "закрытие выражений" .
var OrderSupplement = function() ({
oid: null,
code: "",
description: "",
startdate: "",
enddate: "",
gender: null,
cardowner: null,
box: null,
divisor: 0,
created: null,
createdBy: ""
});