РЕДАКТИРОВАТЬ: В ЭТОЙ ССЫЛКЕ "ОФИЦИАЛЬНЫЙ" ОТВЕТ: 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 = {};
), тогда вы обнаружите, что компилятор прекрасно выполняет все назначения.