Что это означает, что глобальное пространство имен будет загрязнено?

Что это означает, что глобальное пространство имен будет загрязнено?

Я не очень понимаю, что означает загрязнение глобального пространства имен.

3 ответа

Решение

Краткое примечание по сбору мусора

Поскольку переменные теряют область видимости, они будут иметь право на сборку мусора. Если они имеют глобальную область действия, они не будут иметь права на сбор, пока глобальное пространство имен не потеряет область действия.

Вот пример:

var arra = [];
for (var i = 0; i < 2003000; i++) {
 arra.push(i * i + i);
}

Добавление этого в ваше глобальное пространство имен (по крайней мере для меня) должно рекламировать 10000 КБ использования памяти (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());
})();

В JavaScript объявления вне функции находятся в глобальной области видимости. Рассмотрим этот небольшой пример:

var x = 10;
function example() {
    console.log(x);
}
example(); //Will print 10

В приведенном выше примере x объявлен в глобальном масштабе. Любая дочерняя область, например, созданная example функция, эффективно наследующая вещи, объявленные в любых родительских областях (в данном случае это всего лишь глобальная область).

Любая дочерняя область, которая повторно объявляет переменную, объявленную в глобальной области, будет скрывать глобальную переменную, потенциально вызывая нежелательные, трудно отслеживаемые ошибки:

var x = 10;
function example() {
    var x = 20;
    console.log(x); //Prints 20
}
example();
console.log(x); //Prints 10

Глобальные переменные обычно не рекомендуются из-за потенциальной возможности возникновения подобных проблем. Если бы мы не использовали var заявление внутри example функция, мы бы случайно перезаписали значение x в глобальном масштабе:

var x = 10;
function example() {
    x = 20; //Oops, no var statement
    console.log(x); //Prints 20
}
example();
console.log(x); //Prints 20... oh dear

Если вы хотите прочитать больше и понять это правильно, я предлагаю пройти спецификацию ECMAScript. Это может быть не самое захватывающее из чтений, но это поможет без конца.

Когда вы объявляете глобальные переменные, функции и т. Д., Они, например, переходят в глобальное пространство имен. Помимо проблем с производительностью / памятью (которые могут возникнуть), вы можете столкнуться с неудачным конфликтом имен, когда вы переопределите важную переменную или будете использовать не то значение, которое, по вашему мнению, вы используете.

Определения вещей в глобальном пространстве имен следует избегать.

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