Разрешение имен — помогаем интерпретатору
Уменьшаем "многоэтажные" имена
Приведенная в предыдущем посте замена with на временную переменную, экономит не только силы программиста, но и интерпретатора.
Пример:
for (var i = 0; i < 1000; i++) {
one.two.three.four.summ += i;
}
Здесь, кажется, и вводить временную переменную излишне - имя объекта пишется только один раз.
Однако, интерпретатору по этому имени нужно определить конкретное свойство, которое нужно увеличить на
i. То есть произвести разрешение имени.
В нашем случае ему нужно найти локальную переменную "one". Не нашел - запросить вышестоящий контекст и так далее.
В полученом объекте найти свойство "two". Нет такого - пойти по цепочке прототипов.
Повторить поиск для "three", "four" и "summ".
И так тысячу раз одно и тоже.
Поэтому, лучше либо скопировать объект во временную переменную, уменьшив количество "этажей" до двух - "tmp.summ".
Либо вообще избавиться от поиска свойства в объекте:
var summ = 0;
for (var i = 0; i < 1000; i++) {
summ += i;
}
one.two.three.four.summ += summ;
Укорачиваем поиск по контекстам
Как вы уже
знаете, при использовании переменной, её значение сначала ищется в локальном контексте, потом в вышележащем и так до глобального. Как, наверное, понятно, чем ближе будет эта переменная, тем лучше. В идеале она должна быть локальной.
Если нужно производить множество манипуляций с переменной из вышележащего контекста, лучше создать её локальную копию:
var summ = 0;
function bad() // Не слишком здорово
{
for (var i = 0; i < 1000; i++) {
summ += i;
}
}
function good() // Уже лучше
{
var lsumm = 0;
for (var i = 0; i < 1000; i++) {
lsumm += i;
}
summ += lsumm;
}
Стараемся не использовать глобальные переменные
Глобальные переменные, мало того, что лежат в самом дальнем контексте (глобальном), так еще и по совместительству являются свойствами объекта window. Вследствии чего, его невозможно оптимизировать.
Укорачиваем поиск по прототипам
С одной стороны общие функции для объектов эффективнее держать в единственном экземпляре внутри прототипа.
С другой - те же проблемы, что и с исполнительными контекстами. Чем ближе наше свойство, тем быстрее мы его найдем. Лучше всего, если оно будет в самом объекте. Еще лучше в локальной переменной.
Там, где можно, переносите свойства непосредственно в объект или кэшируйте в локальных переменных.