Вы правы, что прикрепление переменных внутри анонимной функции - это хорошая практика, чтобы не загромождать глобальный объект.
Чтобы ответить на два последних вопроса: для переводчика совершенно невозможно знать, что объект больше не будет использоваться, пока есть глобально видимая ссылка на него.Все, что знает переводчик, вы можете в любой момент набрать код, который зависит от window['aVar']
или window['operation']
.
По сути, запомните две вещи:
- Покаобъект находится вокруг, ни один из его слотов не будет волшебным образом освобожден без вашего разрешения.
- Переменные, объявленные в глобальном контексте, являются слотами глобального объекта (
window
в Javascript на стороне клиента).
В совокупности это означает, что объекты в глобальных переменных сохраняются в течение всего жизненного цикла вашего скрипта (если только переменная не переназначена).Вот почему мы объявляем анонимные функции - переменные получают новый объект контекста, который исчезает, как только функция завершает выполнение.В дополнение к выигрышам в эффективности это также уменьшает вероятность конфликтов имен.
Ваш второй пример (с внутренней анонимной функцией) может быть немного переусердствован, хотя.Я бы не стал беспокоиться о том, чтобы «помочь сборщику мусора» - GC, вероятно, все равно не будет работать в середине этой функции.Беспокойство о вещах, которые будут храниться постоянно, а не только немного дольше, чем они были бы в противном случае.Эти самовыполняющиеся анонимные функции в основном являются модулями кода, которые естественным образом связаны друг с другом, поэтому хорошее руководство - подумать, описывает ли это то, что вы делаете.
Есть причины использовать анонимные функции внутри анонимных функций,хоть.Например, в этом случае:
(function () {
var bfa = new Array(24 * 1024*1024);
var calculation = calculationFor(bfa);
$('.resultShowButton').click( function () {
var text = "Result is " + eval(calculation);
alert(text);
} );
})();
Это приводит к тому, что этот гигантский массив захватывается обратным вызовом click, так что он никогда не исчезает.Этого можно избежать, помещая массив в собственную функцию.