Должен ли я использовать глобальную переменную, а если нет, что вместо этого?(Javascript) - PullRequest
3 голосов
/ 16 ноября 2010

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

Спасибо, Эллиот Бонневиль

Psuedocode моих функций:

function GetXML() {//this would be a function which reads in an XML file.
                  //Preferably it would also generate or set an object to hold the XML data.
}

function UseXMLData() { //I would use the XML data here.
}

function UseXMLDataHereAsWell() { //And here as well.
}

Ответы [ 5 ]

6 голосов
/ 16 ноября 2010

Глобальные переменные , как вы, наверное, догадались, считаются плохими.Любой другой код на странице может изменить их - часто потому, что другой программист случайно выбирает то же имя.Вы можете попытаться смягчить этот эффект, выбрав действительно странные имена, но затем вы получите кучу действительно странных имен.

Существует множество способов минимизировать количество глобальных переменных, создаваемых вами в JavaScript.Одним из способов является сохранение всех ваших переменных в одном объекте - это то, что делает jQuery (Технически, jQuery использует два - $ и jQuery.)

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

Плохой пример - загрязняет глобальное пространство имен без необходимости:

var appleCount = 0;

function addApple() {
  appleCount = appleCount + 1;
}

function howManyApples() {
  return appleCount;
}

addApple();
alert(howManyApples());

Лучший пример - создает только одну глобальную переменную:

var appleCounter = {
  count: 0,
  add: function() {
    this.count = this.count + 1;
  },
  howMany: function() {
    return this.count;
  }
};

appleCounter.add();
alert(appleCounter.howMany());

Лучший пример - не создает глобальных переменных:

(function(){
  var appleCounter = {
    count: 0,
    add: function() {
      this.count = this.count + 1;
    },
    howMany: function() {
      return this.count;
    }
  };

  appleCounter.add();
  alert(appleCounter.howMany());
})();
2 голосов
/ 16 ноября 2010

Лучшее решение для того, что вы пытаетесь сделать, - это обернуть все ваши данные в объект и сделать ваши функции методами объекта:

function MyXMLClass() {
  this.data = null;
}

MyXMLClass.prototype = {
  GetXML: function() {
    this.data = ...;
  },

  UseXMLData: function() {
    // use this.data
  },

  /* etc. */
};

И тогда вы можете просто использовать егокак это:

var x = new MyXMLClass();
x.GetXML();
x.UseXMLData();
...
2 голосов
/ 16 ноября 2010

В многократно используемых сценариях следует избегать глобальных переменных.

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

Если вы пишете многократно используемый компонент или сложную веб-страницу, вам следует использовать вместо этого замыкания или пространства имен.

Для получения более конкретных рекомендаций просьба предоставить более подробную информацию.

РЕДАКТИРОВАТЬ : Вы должны создать XmlData класс.

Например:

function XmlData(...) { 
    this.data = ...;
}
XmlData.prototype.doSomething = function(...) { 
    //Use this.data
}

В зависимости от того, откуда поступают ваши данные, вы можете захотеть сделатьотдельная функция для извлечения данных.

Здесь - хорошее объяснение.

1 голос
/ 16 ноября 2010

Создайте пространство имен, поместите все свои функции в это пространство имен.

MyNS = {
    x: 1, y: 2 // Here you define shared variables
};

MyNS.func1 = function(){}; // Here you define your functions that need those variables
1 голос
/ 16 ноября 2010

Избегайте глобальных переменных, это плохое программирование. Попробуйте передать его в качестве аргумента или используйте интервал имен, чтобы ограничить его область действия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...