Ответ 1
Быстрая заметка о сборке мусора
Поскольку переменные теряют область действия, они будут иметь право на сбор мусора. Если они охвачены глобально, то они не будут иметь права на сбор до тех пор, пока глобальное пространство имен не потеряет область действия.
Вот пример:
var arra = [];
for (var i = 0; i < 2003000; i++) {
arra.push(i * i + i);
}
Добавление этого в ваше глобальное пространство имен (по крайней мере для меня) должно обладать 10 000 kb использования памяти (win7 firefox), которые не будут собраны. Другие браузеры могут обрабатывать это по-другому.
Принимая во внимание тот же код в области действия, который выходит за пределы области видимости:
(function(){
var arra = [];
for (var i = 0; i < 2003000; i++) {
arra.push(i * i + i);
}
})();
Позволяет arra
терять область действия после закрытия и иметь право на сбор мусора.
Глобальное пространство имен - ваш друг
Несмотря на многочисленные претензии против использования глобального пространства имен, это ваш друг. И как хороший друг, вы не должны злоупотреблять своими отношениями.
Будьте осторожны
Не злоупотребляйте (обычно называемым "загрязняющим" ) глобальным пространством имен. И что я имею в виду, не злоупотребляйте глобальным пространством имен - не создавайте несколько глобальных переменных. Вот пример использования глобального пространства имен.
var x1 = 5;
var x2 = 20;
var y1 = 3
var y2 = 16;
var rise = y2 - y1;
var run = x2 - x1;
var slope = rise / run;
var risesquared = rise * rise;
var runsquared = run * run;
var distancesquared = risesquared + runsquared;
var distance = Math.sqrt(dinstancesquared);
Это создаст 11 глобальных переменных, которые могут быть переписаны или неправильно истолкованы где-то.
Будьте изобретательны
Более изобретательный подход, который не загрязняет глобальное пространство имен, заключается в том, чтобы обернуть это все в шаблон модуля и использовать только одну глобальную переменную при экспонировании нескольких переменных.
Вот пример: (Обратите внимание, что это просто и нет обработки ошибок)
//Calculate is the only exposed global variable
var Calculate = function () {
//all defintions in this closure are local, and will not be exposed to the global namespace
var Coordinates = [];//array for coordinates
var Coordinate = function (xcoord, ycoord) {//definition for type Coordinate
this.x = xcoord;//assign values similar to a constructor
this.y = ycoord;
};
return {//these methods will be exposed through the Calculate object
AddCoordinate: function (x, y) {
Coordinates.push(new Coordinate(x, y));//Add a new coordinate
},
Slope: function () {//Calculates slope and returns the value
var c1 = Coordinates[0];
var c2 = Coordinates[1];
return c2.y - c1.y / c2.x - c1.x;//calculates rise over run and returns result
},
Distance: function () {
//even with an excessive amount of variables declared, these are all still local
var c1 = Coordinates[0];
var c2 = Coordinates[1];
var rise = c2.y - c1.y;
var run = c2.x - c1.x;
var risesquared = rise * rise;
var runsquared = run * run;
var distancesquared = risesquared + runsquared;
var distance = Math.sqrt(distancesquared);
return distance;
}
};
};
//this is a "self executing closure" and is used because these variables will be
//scoped to the function, and will not be available globally nor will they collide
//with any variable names in the global namespace
(function () {
var calc = Calculate();
calc.AddCoordinate(5, 20);
calc.AddCoordinate(3, 16);
console.log(calc.Slope());
console.log(calc.Distance());
})();