Почему парсер 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 к ненулевому значению и позже его получить. Разумеется, извлечение значения перед настройкой показало бы ошибку.

Эффект приведенного выше кода выглядит следующим образом:

var OrderSupplementJson = function() {}

Мой вопрос:

Почему код выше принят и не генерирует (синтаксическую) ошибку любого типа?

Ответ 1

Потому что oid: определяет label.

Он синтаксически исправляет, но не имеет ничего полезного. Это, очевидно, ошибка.

Ответ 2

Ответ, объясняющий, что ключи обрабатываются как метки корректно, но я просто хотел исправить предпосылку вопроса.

Это не синтаксис 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: ""
});