Почему глобалы плохи? - PullRequest
       10

Почему глобалы плохи?

12 голосов
/ 22 ноября 2010

Для меня имеет смысл использовать его здесь.Какой будет альтернатива?Как я могу вообще избегать их использования и, самое главное, почему jsLint плохо использовать глобалы.

(function($){
  $(function(){
   $body = $('body'); //this is the BAD Global

   $.each(somearray ,function(){ $body.dosomething() });

   if (something){
     $body.somethingelse();
   }

  });
}(jQuery));

Можете ли вы помочь мне понять это?И дайте мне лучшее решение?

Ответы [ 5 ]

18 голосов
/ 22 ноября 2010

Глобалы плохие, потому что они не вызывают проблем сразу.Только позже, после того, как вы используете их повсеместно, они вызовут очень уродливые проблемы - которые вы больше не сможете решить без написания кода с нуля.

Пример: вы используете $body для определения некоторыхфункции.Это отлично работает.Но в конце концов, вам также нужно значение.Таким образом, вы используете $body.foo.Работает отлично.Затем вы добавляете $body.bar.И затем, спустя несколько недель, вам нужно другое значение, поэтому вы добавляете $body.bar.

. Вы проверяете код, и он, кажется, работает.Но на самом деле вы «добавили» одну и ту же переменную дважды.Это не проблема, потому что JavaScript не понимает концепцию «создать новую переменную один раз».Он просто знает «создать, если он уже не существует».Таким образом, вы используете свой код и, в конце концов, одна функция изменит $body.bar, нарушая другую функцию.Даже на поиск проблемы у вас уйдет много времени.

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

2 голосов
/ 22 ноября 2010

Глобальные переменные могут конфликтовать с другими сценариями или могут быть перезаписаны. Когда вам не нужны глобальные, желательно избегать их. Просто используйте var (или let, если ваша JS-Version-Support больше 1.7):

(function() {
  var foo = 'bar';
  alert(foo);
})();
2 голосов
/ 22 ноября 2010

Вы можете переписать это как

var $body = $('body');

Это (использование ключевого слова var) сделает его локальной переменной, чего достаточно для ваших целей. Это все еще будет в пределах вашего each обратного вызова.

Причина, по которой использование глобалов плохо, заключается в том, что они могут быть перезаписаны чем-либо другим. Чтобы ваш код хорошо масштабировался, он зависит от того, какие другие сценарии вы используете. Желательно, чтобы сценарий был как можно более самодостаточным, с минимально возможными зависимостями, указывающими на мир вне его.

2 голосов
/ 22 ноября 2010

вы должны определить его с помощью var $ body, тогда он будет локальным в области действия этой функции, без var он может быть перезаписан всеми

(function($){
  $(function(){
   var $body = $('body'); //this is the local variable

   $.each(somearray ,function(){ $body.dosomething() });

   if (something){
     $body.somethingelse();
   }

  });
}(jQuery));
0 голосов
/ 22 ноября 2010

jsLint очень строгий. Вероятно, не стоит слишком зацикливаться на этом.

Но если вы чувствуете себя плохо, вы можете сделать это так же, как вы ограничены jQuery:

(function($){
  $(function(){
   $.each(somearray ,(function($body){ $body.dosomething() })($('body'));

   if (something){
     $('body').somethingelse();
   }

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