en.wikipedia.org/wiki/Comma_operator

вая следующий код coffeescript:

class Animal
  constructor: (@name) ->
  speak: (things) -> "My name is #{@name} and I like #{things}"

Это генерируется:

var Animal = (function() {
  function Animal(name) {
    this.name = name;
  }
  Animal.prototype.speak = function(things) {
    return "My name is " + this.name + " and I like " + things;
  };
  return Animal;
})();

Но почему не генерируется этот более идиоматический код?

var Animal = function Animal(name) {
  this.name = name;
};
Animal.prototype.speak = function(things) {
  return "My name is " + this.name + " and I like " + things;
};

Я знаю, что coffeescript оборачивает множество вещей в анонимных функциях, чтобы контролировать утечку области, но что здесь может быть утечка?

 ryeguy12 янв. 2011 г., 17:19
Субъективное и аргументированное закрытое голосование? В самом деле? Это правильный вопрос, спрашивающий, почему необходимо обернуть функции в анонимную функцию.

Ответы на вопрос(3)

Измой другой ответ:

Для большинства разумных классов замыкание, генерируемое CoffeeScript, генерирует меньший минимизированный вывод. Закрывающая оболочка составляет 25 байтов минимизированных накладных расходов, но этоспасает вас от повторения имени класса, сохранениеk * N байты (k = буквы в имени, N = количество ссылок). например, если класс какBoilerPlateThingyFactory имеет 2+ метода, оболочка замыкания генерирует меньший минимизированный код.


более подробно...

Код, сгенерированный Coffee с использованием замыкания, сводится к:

// Uglify '1.js' = 138 bytes (197 w/ whitespace):

var Animal=function(){function e(e){this.name=e}return e.prototype.speak=function(e){return"My name is "+this.name+" and I like "+e},e}();

// with whitespace ("uglifyjs -b"):

var Animal = function() {
    function e(e) {
        this.name = e;
    }
    return e.prototype.speak = function(e) {
        return "My name is " + this.name + " and I like " + e;
    }, e;
}();

Альтернативная «идиоматическая» реализация Ryeguy сводится к следующему:

// Uglify '2.js' = 119 bytes (150 w/ whitespace):

var Animal=function(t){this.name=t};Animal.prototype.speak=function(e){return"My name is "+this.name+" and I like "+e};

// with whitespace ("uglifyjs -b"):

var Animal = function(t) {
    this.name = t;
};

Animal.prototype.speak = function(e) {
    return "My name is " + this.name + " and I like " + e;
};

Обратите внимание, что имя «Животное» существует только один раз в форме «Кофе» и N = 2 раза в «идиоматической» разновидности Ригью. Теперь «Животное» состоит всего из 6 букв, и есть только 1 метод, поэтому кофе здесь должен проигрывать на 25-6 = 19 байт. Сверяясь с моим минимизированным кодом, это 138 байтов до 119 байтов, для дельты ... 19 байтов. Добавьте еще 4 метода, и преимущество переключится на Кофе. И это не просто методы; константы классов и другие типы ссылок тоже учитываются.

 Dave Dopson15 мар. 2013 г., 21:17
@JustinMorgan - Вы, сэр, обнаружили «оператор запятой»! Это как точка с запятой, но более мощный, так как он может быть использован в качестве выражения. так что «а, б, в»; оценит «a», затем «b», затем «c», и общее выражение будет иметь значение из «c». Это оператор, который JS наследует от C, fwiw.en.wikipedia.org/wiki/Comma_operator
 Justin Morgan15 мар. 2013 г., 17:27
Через запятуюreturn Выражение в вашем увеличенном коде интересно. В моей консолиreturn x, y, z; кажется, оценивает все три выражения, но возвращает только последнее. Есть ли какой-то эффект от этого, кроме как сделать код более «уродливым»?
Решение Вопроса

rnet Explorer. (В данном случае «Животное».) Если вы просто используете именованную функцию в области видимости верхнего уровня, она будет конфликтовать с любымvar Animal = объявления, которые могут присутствовать ... даже в нижних областях, что препятствует правильной ссылке на них. Чтобы обойти ошибку IE, мы включаем функцию-обертку вокруг определения класса.

 matyr12 янв. 2011 г., 20:31
«Конфликт имен» не совсем проблема (вы делаетеvar Animal = так или иначе). Проблема в том, что вы никогда не должны были именовать функциювыражения для JScript. Подробнее об «ошибке IE»:kangax.github.com/nfe

включая имена классов, а не только имена функций, когда выбрасывается исключение.

 casablanca12 янв. 2011 г., 18:00
@Sean Vieira: Я не вижу именованных анонимных функций в коде ОП.
 ryeguy12 янв. 2011 г., 17:58
@Sean: Это объясняет, почему функция названаAnimal, но, похоже, не объясняет, почему он заключен в анонимную функцию.
 casablanca12 янв. 2011 г., 17:39
Можете ли вы уточнить? Я не уверен, что понимаю, как это работает.
 Sean Vieira12 янв. 2011 г., 17:49
@casablanca - см .:javascriptkata.com/2010/05/19/... Это разница между видениемaonon(), aonon() а такжеfunc1(), func2() в трассировке стека.
 Sean Vieira12 янв. 2011 г., 19:32
@casablanca - см. ответ jashkenas:stackoverflow.com/questions/4671072/... (Вот почему я люблю StackOverflow).

Ваш ответ на вопрос