закрытие javascript и размещение функций - PullRequest
3 голосов
/ 28 октября 2008

Влияет ли размещение функции на производительность замыканий в области видимости? Если так, где находится оптимальное место для размещения этих функций? Если нет, является ли подразумеваемая связь по закрытию достаточной причиной для логического размещения функции в другом месте?

Например, если foo не полагается на значение localState , то факт, что localState доступен из foo имеют значение относительно времени выполнения foo , использования памяти и т. д .?

(function(){
    var localState;

    function foo(){
        // code
    }

    function bar(){
        // code
        return localState;
    }
})();

Другими словами, будет ли это лучшим выбором, и если да, то почему?

(function(){
    function foo(){
        // code
    }

    var localState;

    function bar(){
        // code
        return localState;
    }
})();

Дариус Бэкон предположил ниже , что два приведенных выше примера идентичны, поскольку к localState можно получить доступ из любого места в пределах блока. Однако приведенный ниже пример, где foo определен вне блока, может быть другим случаем. Что ты думаешь?

function foo(){
    // code
}

(function(){

    var localState;

    function bar(){
        // code
        foo();
        return localState;
    }
})();

Ответы [ 6 ]

5 голосов
/ 28 октября 2008

Собака, я надеюсь, что порядок объявлений будет таким, что интерпретаторы JavaScript будут абстрагировать. В любом случае, если есть разница в производительности, она будет настолько минимальной, чтобы сделать этот плакат детским для зла преждевременной оптимизации.

5 голосов
/ 28 октября 2008

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

При этом ... если в создаваемой среде у вас абсурдное количество переменных, то время выполнения foo может быть затронуто, так как поиск переменных, вероятно, займет больше времени. Если есть тонны переменных, которые вы больше не используете в определяемой вами функции foo, и foo они тоже не нужны, то foo приведет к тому, что они не будут собираться мусором, что также может быть проблемой.

3 голосов
/ 29 октября 2008

Каждая функция в Javascript является закрытием. Среда выполнения для разрешения значения переменной возникает только в том случае, если функция ссылается на переменную. Например, в этом примере функция y захватывает значение x, даже если x не ссылается непосредственно на y:

var x = 3;
function y() eval("x");
y();
3
2 голосов
/ 28 октября 2008

Я не думаю, что это повлияет на производительность, так как java-скрипт не использует понятие стека функций. Поддерживает лексическую область видимости. То же состояние передается по вызовам закрытия. Кстати, в вашем примере вы, похоже, не выполняете никаких операторов!

1 голос
/ 28 октября 2008

Область действия объявления var или функции - это весь блок, в котором он появляется, независимо от того, где в блоке находится объявление; поэтому было бы удивительно, если бы это сказалось на эффективности.

То есть не должно иметь значения, является ли "function foo ()" до или после "var localState" в этом блоке. может иметь значение, находится ли «функция foo ()» в этом блоке или включающем (если она может быть поднята в более высокую область, потому что она не использует любых локальных переменных) ; это зависит от деталей вашего компилятора Javascript.

0 голосов
/ 14 августа 2009

В ваших примерах разница не будет иметь большого значения. Даже если foo находится в глобальной области видимости, у вас не будет проблем.

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

Для лучшей идеи попробуйте следующие два примера:

CheckOne();
function CheckOne() {
    alert('check...check one.');
}

CheckTwo();
var CheckTwo = function() {
    alert('check...check two.');
};

Единственное отличие второго от первого - это стиль, который они используют для объявления своих функций. Второй генерирует опорную ошибку.

Приветствие.

...