Глобальные переменные против передачи значения в функцию? - PullRequest
3 голосов
/ 22 сентября 2011

Я новичок в JavaScript, и у меня есть простой (я полагаю) вопрос, касающийся лучших методов доступа к переменным в функциях:

Когда мне следует объявить глобальную переменную, а не просто передать значение вфункция?

Ответы [ 3 ]

5 голосов
/ 22 сентября 2011

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

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

В качестве примера возьмем следующее.

// Your code
myParam = { prop: 42 };
function operateOnMyParam() {
  console.log(myParam.prop);
}

Здесь я объявил 2 глобальные переменные

  • myParam
  • operaOnMyParam

Это может нормально работать при тестированииJavaScript в изоляции.Однако что произойдет, если после тестирования пользователь объединит вашу библиотеку javascript с моей библиотекой javascript, которая имеет следующие определения

// My code
function myParam() {
  console.log("...");
} 

Это также определяет глобальное значение с именем myParam, которое конфликтует с вашим myParam.Какая победа зависит от того, в каком порядке были импортированы скрипты.Но в любом случае один из нас находится в беде, потому что один из наших глобальных объектов мертв.

2 голосов
/ 22 сентября 2011

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

var myObject = {
   variableA : "Foo",
   variableB : "Bar",
   functionA : function(){
      //do something
      //access local variables
      this.variableA
   }
}

//call functions and variables
myObject.variableA;
myObject.functionA();
2 голосов
/ 22 сентября 2011

Есть много, много причин ... но простая причина в том, что ... Аргумент функции существует только в функции, пока она выполняется. Глобальная переменная существует постоянно, что означает:

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

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

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