Javascript Closures и область видимости переменной, когда заканчивается вызов функции

Я прочитал эту прекрасную статью: как работают JavaScript-замыкания?

Но у меня все еще есть вопросы...

Теги Stackru определяют "Замыкания" как "Замыкание - это функция первого класса, которая ссылается на (закрывает) переменные из области, в которой оно было определено. Если закрытие все еще существует после окончания определяющей области, то закрываемые переменные будут продолжаться тоже существовать".

Когда мои функции заканчиваются возвратом, все переменные, определенные в них, удаляются, а выделение памяти освобождается? Мне кажется, что существуют условия, когда можно было ответить "да" или "нет".

Да, я знаю, что память обильна и свободна, но это не мой вопрос.

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

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

Может кто-нибудь поделиться примером того, где переменная продолжает существовать?

И... получаю ли я какую-либо выгоду, если в начале каждой функции я объявляю свои переменные и до использования "return true;" если я переназначу переменным значение ноль?

Вся помощь оценена...

4 ответа

obj = {
    func: function(){
        var test = 'preserved value';
        this.func2 = function(){
            console.log(test);
        };
    }
};

obj.func();
obj.func2();  //'preserved value'
obj.func = undefined;
obj.func2();  //'preserved value'

Как видите, даже после полного сдувания оригинального объема (func) ограждающая область сохраняет test вар.

Когда ты return true от функции у вас нет замыкания. У вас есть замыкание, когда вы возвращаете функцию из функции, например так:

function makeAdder( firstNumToAdd ){
     return function( secondNumToAdd ){
          return mainNumToAdd + secondNumToAdd;
     }
}

var add3 = makeAdder(3);

var seven = add3(4);

В приведенном выше примере переменная firstNumToAdd, хотя ограничен до функции makeAdder всегда доступен для внутренней функции, даже если функция завершена после выполнения строки var add3 = makeAdder(3);

Пожалуйста, поправьте меня, если я ошибаюсь, но я не думаю, что

на некоторые переменные внутри функции все еще можно ссылаться за пределами области действия функции

правда.

Замыкания запоминают контекст вызова функции и связывают соответствующие переменные (т.е. thisи т. д.) до объема закрытия. Если это правильно, то повторный вызов замыкания вызовет сбор мусора в старых значениях переменных, и вам не придется беспокоиться о потере памяти или несинхронизации данных.

num будет существовать внутри a функция вне IIFE c который возвращается a

var c = (function() {
  var num = 10;
  var a = function a(n) {
    console.log(n)
    return n * Math.random()
  };
  return a.bind(null, num)
}());

var res = [c(), c(), c()];
console.log(res)

Другие вопросы по тегам