2013-06-02 3 views
0

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

 this.subscribe.call(this, e.horizontaladded, function (a, fn) { 

      if (!a.extra.owner.id) { return; }; 

     (function (a) { 


       dataBase.insert(
        dbPart(
        ['horizontal?a=', a.extra.owner.instanceName, '&id=', a.extra.owner.id].join(''), 
        a.target 
        ), 
        dbCB(success, error) 
       ); 


       function success(data, status) { 

        if (status === 'error') { return; }; 

        console.log('Horizontal Added'); 


        a.target.id = data.id, 
        a.target.HTML().addClass('alum_' + data.id), 
        a.target.finish.id = data.finishID, 
        a.target.size.id = data.sizeID, 
        a.target.siteLine.id = data.sitelineID; 


      }(a)); 

    }, true); 

Другими словами, для каждого вызова, который вызывается к e.horizontaladded, что я подписался на каждой новой анонимной функции вызывается и замкнулся со всеми его собственные персональные данные и вывоз мусора очищает все закрытие?

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

ответ

1

Закрытие очищается сборщиком мусора, когда нет кода, который мог бы достичь любой из переменных внутри крышки.

Действительно закрытие не работает в сборщике мусора, чем любой другой объект в javascript. Когда никто не ссылается на что-либо в нем, сборщик мусора может очистить его.

В вашем конкретном примере выражение, вызванное немедленно вызываемым выражением, создает закрытие, которое будет продолжаться до тех пор, пока любой другой код имеет ссылку на что-то в закрытии. Итак, когда функция database.insert() начинает выполнение, у нее есть ссылка на вашу функцию success() и она сохраняет закрытие. Когда он закончит и вызовет функцию success(), он, по-видимому, очистит ее ссылку на функцию success() после ее вызова, освободив тем самым ссылку на что-то внутри закрытия. Если сборщик мусора тогда не находит никаких других ссылок на что-либо в этом закрытии, он затем освободит закрытие.

+0

Хорошо, спасибо вам большое за помощь. Только то, что мне было нужно. –

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