Подтвердить что ты не робот

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

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

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

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

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

  });
}(jQuery));

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

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

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

  });
}(jQuery));

Ответ 3

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

(function() {
  var foo = 'bar';
  alert(foo);
})();

Ответ 4

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

var $body = $('body');

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

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

Ответ 5

jsLint очень строгий. Возможно, нет необходимости слишком зависеть от этого.

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

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

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

  });
}(jQuery));