2013-10-08 3 views
0

У меня есть яваскрипт функция, которая содержит другой яваскрипт функцию внутри (закрытия)Javascript Вложенных функции инициализация

function function1() { 
    $("button").bind("click", function() { 
     function2(); 
    }); 

    function function2() { 
     // code 
    }; 
}; 

Моего вопрос:

Когда я называю function1() для много раз, делает function2() создается каждый раз (и сохраняется в памяти)? или он является общим?

function1 не используется в качестве конструктора, так что я не думаю, что я должен использовать prototype

+1

Да функция создается каждый раз, но ее уничтожают после выполнения функции1(), следовательно, не присутствуют в памяти после выполнения функции1. Я бы использовал firebug, чтобы проверить то же самое –

+0

Как я могу проверить это с помощью firebug? – Catalin

+0

это плагин firefox. Просто пойдите в Google. Вы найдете его –

ответ

0

Да, function2 будет создаваться каждый раз, когда выполняется function1, что, возможно, является недопустимой неэффективностью.

Код в этом вопросе будет выполняться более эффективно следующим образом:

function function2() { 
    // code 
}; 
function function1() { 
    $("button").bind("click", function2); 
}; 

Таким образом, function2 определяется один раз и используется, потенциально, во много раз.

Цена, которую вы платите за эту эффективность, заключается в отказе от function2 возможности доступа к любым варкам, объявленным внутри function1. Как указано, таких варов нет, так что все будет в порядке.

2

Каждый раз, когда вы звоните function1, новый function2 создается и сохраняется в памяти, и подписался как часть обработчик кликов.

Функции2, созданные функцией1, не могут собирать мусор, если они могут быть вызваны через ваш обработчик кликов.

+0

Удаление элемент из DOM с использованием '$ .remove()' позволит собирать мусор? – Catalin

+0

Я не знаю, будет ли '$ .remove()' разрешать 'function2' быть мусором, собранным в реализациях браузера. Я ожидал бы этого, потому что иначе это будет утечка памяти. – jcarpenter2

+0

@ RaraituL: Да, удаление элемента из DOM приведет к сбою мусора во всех браузерах 'function2'. В версиях IE менее 7 'function2' не будет собираться мусором, если он содержит ссылки на элемент, так как IE7 и ниже имели ошибку, которая не могла мусор собирать циклические ссылки, если эти ссылки приводят к DOM. Обычные, не-DOM круговые ссылки являются сборщиками мусора. Большинство библиотек, таких как YUI и jQuery, имеют функции, которые рекурсивно удаляют обработчики событий на элементах DOM именно по этой причине. – slebetman

Смежные вопросы