Вопрос

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

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

(function(){
    var localState;

    function foo(){
        // code
    }

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

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

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

    var localState;

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

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

function foo(){
    // code
}

(function(){

    var localState;

    function bar(){
        // code
        foo();
        return localState;
    }
})();
Это было полезно?

Решение

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

var x = 3;
function y() eval("x");
y();
3

Другие советы

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

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

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

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

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

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

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

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

Чтобы лучше понять, попробуйте следующие два примера:

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

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

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

Ваше здоровье.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top