область действия функции JavaScript, объявление переменной - PullRequest
1 голос
/ 04 марта 2011

Допустим, у меня есть следующий сценарий:

var namespace = {};
(function($)
{
    $.extend(namespace, 
    {
        test1: function(someArray, someObj)
        {
             for(var i= 0, ii= someArray.length;i<ii;i++)
             {
                 var text = someObj[someArray[i]];
                 // do something with text
             }
        },
        test2: function(someArray, someObj,i,ii,text)
        /*
             see that the i,ii,text are  unused parameters,
             that will be used instead of variables
        */
        {
             for(i= 0, ii= someArray.length;i<ii;i++)
             {
                  text = someObj[someArray[i]];
                 // do something with text
             }
        },
    });
})(jQuery);

Теперь результаты test1 и test2 одинаковы ... но как насчет производительности, использования памяти ... Есть ли разница между объявлением тестовых переменных i, ii двумя способами, представленными выше?

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

Так какой метод работает лучше всего? а почему?


[Изменить]

Спасибо всем за ответы!

Нет проблем, если код имеет проблемы с читабельностью ... Меня сейчас интересует только производительность / использование памяти.

Ответы [ 5 ]

1 голос
/ 04 марта 2011
  1. Почему вы не профилируете свой код?
  2. Переменные также локальны в test1.Вы объявляете их с var i.Нет никакой разницы между этими методами.
1 голос
/ 04 марта 2011

Если вы не объявляете свои переменные с var i, тогда они становятся неявно глобальными.

Всегда объявляйте ваши переменные.Если бы вы сделали какой-то сравнительный анализ, вы бы обнаружили, что объявленные локальные переменные на самом деле быстрее, чем подразумеваемые глобальные переменные.Также вы не попадете в глобальное состояние таким образом.

Benchmark! .

Как видите, производительность идентична.

InС точки зрения использования памяти, локальные переменные (test1), вероятно, лучше, так как компилятору не нужно помнить, что функция имеет 5 параметров.

Но это нано оптимизация Если вы заботитесь оразличия в производительности этого калибра напишите сборка вместо.Перейти на читаемый и код .

[Редактировать]

Не заметил "локальные" переменные в методепараметр.Это убийца читаемости!Не делай этого.Вы обнаружите, что test1, вероятно, еще более эффективен.

0 голосов
/ 04 марта 2011

Это может быть незначительно, но объявление новой переменной (текста) в каждой итерации потребует нового выделения памяти, я полагаю. Хотя я не уверен, как JavaScript справляется с этим. Обычно я объявляю переменные заранее, а затем присваиваю значения по этой причине, но это только потому, что кто-то сказал: «Эй, ты должен сделать это так» и представил тот же аргумент.

0 голосов
/ 04 марта 2011

test1 быстрее, потому что каждый раз, когда JavaScript ищет символы (например, имя переменной), он начинает с поиска в локальной области видимости.Таким образом, используя глобальную область видимости, он должен искать больше мест, чтобы найти символы.То же самое относится и к параметрам, но они лучше, чем глобальные.

0 голосов
/ 04 марта 2011

Все переменные в "test1" объявлены с var, поэтому они не глобальные. Эти два должны быть по существу одинаковыми.

...