Почему Closure Compiler не сокращает это? - PullRequest
4 голосов
/ 06 апреля 2011

Я не уверен, является ли это просто ошибкой или предполагаемой функцией.

В принципе, у меня есть эта крошечная функция (теперь я вижу, что end здесь окрашено в синий цвет, но это прекрасно работает, еслиЯ переименовываю его во что-то еще, но у меня все еще есть проблема):

function f(a, b) {
    var start = Math.min(a, b);
    var end = Math.max(a, b);

    tb.selectionStart = start;
    tb.selectionEnd = end;
};

При компиляции с закрытием я получаю:

function f(a,b){var c=Math.max(a,b);tb.selectionStart=Math.min(a,b);tb.selectionEnd=c};

Однако, почему selectionStart установлено в Math.min напрямую, в то время как selecitonEnd устанавливается в переменную (c), которая объявляется первой?Разве это не короче tb.selectionEnd=Math.max(a,b)?

Любые идеи приветствуются.

Ответы [ 2 ]

4 голосов
/ 06 апреля 2011

РЕДАКТИРОВАТЬ: В ЭТОЙ ССЫЛКЕ "ОФИЦИАЛЬНЫЙ" ОТВЕТ: https://web.archive.org/web/20151226143155/http://code.google.com/p/closure-compiler/issues/detail?id=410

Я думаю, что присваивание переменной, сопровождаемое немедленно использованием этой переменной, может быть встроенным.Однако, если между ними есть какое-либо утверждение, которое не может быть доказано без побочных эффектов, компилятор его не встроит.

В вашем случае присвоение переменной "start" отделено отиспользование «start» только оператором присваивания «end».Однако это утверждение не имеет побочных эффектов, поскольку Math.max является внутренней функцией, и компилятор знает, что оно не имеет побочных эффектов.

Однако, в вашем случае, присваивание переменной end являетсяотделен от использования этой переменной оператором, который является присваиванием «начала» свойству.Теперь я считаю, что компилятор не предполагает, что простое присваивание свойству всегда без побочных эффектов;это связано с тем, что некоторые свойства, когда они назначаются, фактически вызывают другое поведение или изменяют глобальное состояние (например, RegExp).В некоторых системах присваивание свойств фактически запускает определенные системные функции (например, аппаратный интерфейс), которые, в свою очередь, могут содержать побочные эффекты.

Вот почему иногда, когда у вас есть код, подобный этому:

foo.bar = 1;
foo.bar = 2;
foo.bar = 3;

Компилятор не удалит первые два оператора, поскольку присваивание "bar" может иметь побочные эффекты.

Таким образом, в вашем вопросе переменная "end" не может быть встроенной, поскольку операторtb.selectionStart = start; может иметь побочные эффекты (возможно, только в странных случаях).

Если вы сделаете "tb" локальной переменной, или что-то, что компилятор полностью контролирует (например, простой объект: var tb = {};), тогда вы обнаружите, что компилятор прекрасно выполняет все назначения.

3 голосов
/ 06 апреля 2011

если вы вставите этот код, это сработает.

function f(a, b) {
    var start = Math.min(a, b);
    tb.selectionStart = start;

    var end = Math.max(a, b);
    tb.selectionEnd = end;
};

function f(a,b){tb.selectionStart=Math.min(a,b);tb.selectionEnd=Math.max(a,b)};

i это ошибка компилятора закрытия.

...