<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://support.qbpro.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%9E%D0%B1%D0%BB%D0%B0%D1%81%D1%82%D1%8C_%D0%B2%D0%B8%D0%B4%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8_%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%B2_Javascript</id>
	<title>Область видимости переменной в Javascript - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://support.qbpro.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%9E%D0%B1%D0%BB%D0%B0%D1%81%D1%82%D1%8C_%D0%B2%D0%B8%D0%B4%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8_%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%B2_Javascript"/>
	<link rel="alternate" type="text/html" href="https://support.qbpro.ru/index.php?title=%D0%9E%D0%B1%D0%BB%D0%B0%D1%81%D1%82%D1%8C_%D0%B2%D0%B8%D0%B4%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8_%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%B2_Javascript&amp;action=history"/>
	<updated>2026-04-03T17:45:53Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.38.1</generator>
	<entry>
		<id>https://support.qbpro.ru/index.php?title=%D0%9E%D0%B1%D0%BB%D0%B0%D1%81%D1%82%D1%8C_%D0%B2%D0%B8%D0%B4%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8_%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%B2_Javascript&amp;diff=227&amp;oldid=prev</id>
		<title>imported&gt;Supportadmin: Новая страница: «оригинал:http://habrahabr.ru/post/78991/ ----- Для меня одним из самых проблемных мест Javascript было управле…»</title>
		<link rel="alternate" type="text/html" href="https://support.qbpro.ru/index.php?title=%D0%9E%D0%B1%D0%BB%D0%B0%D1%81%D1%82%D1%8C_%D0%B2%D0%B8%D0%B4%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8_%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%B2_Javascript&amp;diff=227&amp;oldid=prev"/>
		<updated>2013-08-04T10:00:30Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: «оригинал:http://habrahabr.ru/post/78991/ ----- Для меня одним из самых проблемных мест Javascript было управле…»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;оригинал:http://habrahabr.ru/post/78991/&lt;br /&gt;
-----&lt;br /&gt;
Для меня одним из самых проблемных мест Javascript было управление переменными. Излагаю простым русским языком.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Области видимости переменных ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Переменные в Javascript бывают глобальными и локальными. Глобальная переменная доступна везде, локальная — только в текущей области видимости.&lt;br /&gt;
&lt;br /&gt;
Технически, глобальные переменные — всего лишь свойства объекта window, поскольку весь код выполняется в его контексте.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script&amp;gt;&lt;br /&gt;
   alert(location); // сообщит window.location&lt;br /&gt;
 &amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Из этого следует, что глобальные переменные могут затирать свойства window (я уже молчу о том, что они зло, нарушают инкапсуляцию и все такое).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Объявление переменных ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
При присвоении значения неопределенной локальной переменной используется или создается глобальная переменная.&lt;br /&gt;
&lt;br /&gt;
 function foo() {&lt;br /&gt;
  a = 2;&lt;br /&gt;
  b = 3;&lt;br /&gt;
  return a+b;&lt;br /&gt;
 }&lt;br /&gt;
 alert(a); // undefined&lt;br /&gt;
 a = 'очень важное значение';&lt;br /&gt;
 alert(a); // очень важное значение&lt;br /&gt;
 foo();&lt;br /&gt;
 alert(a); // 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Таким образом можно легко затереть лишнего. По-моему такое поведение абсолютно нелогично, но, что ж, это не самое странное место яваскрипта. В любом случае неявного определения переменных стоит избегать.&lt;br /&gt;
&lt;br /&gt;
Явно объявлять переменные можно и нужно ключевым словом var.&lt;br /&gt;
&lt;br /&gt;
 var a = 2;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Такая строка всегда создает новую локальную переменную. Если объявление происходит вне функций, то она будет глобальной, что вполне логично.&lt;br /&gt;
&lt;br /&gt;
 function foo() {&lt;br /&gt;
  var a = 2;&lt;br /&gt;
  var b = 3;&lt;br /&gt;
  return a+b;&lt;br /&gt;
 }&lt;br /&gt;
 alert(a); // undefined&lt;br /&gt;
 var a = 'очень важное значение';&lt;br /&gt;
 alert(a); // очень важное значение&lt;br /&gt;
 foo();&lt;br /&gt;
 alert(a); // очень важное значение&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как объявить глобальную переменную из функции? Как обратиться к глобальной переменной, если есть локальная с таким же именем? Очень просто — нужно обратиться к ней как к свойству window:&lt;br /&gt;
&lt;br /&gt;
 function foo() {&lt;br /&gt;
  var location = 'location';&lt;br /&gt;
  alert(location); // вернет 'location'&lt;br /&gt;
  alert(window.location); // вернет window.location&lt;br /&gt;
  window.a = 'переменная из функции';&lt;br /&gt;
 }&lt;br /&gt;
 alert(a); // undefined&lt;br /&gt;
 foo();&lt;br /&gt;
 alert(a); // переменная из функции &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Наследование области видимости ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Меня всегда смущало то, что в Javascript можно определять функции внутри функций, а использовать их потом где угодно. Ну да, если посмотреть, точно то же самое можно делать в Ruby, и, наверное, во многих других языках тоже.&lt;br /&gt;
&lt;br /&gt;
Переменные при этом передаются очень просто: если на момент определения функции переменная существовала, то она будет существовать и внутри функции. Откуда бы ее не вызывали.&lt;br /&gt;
&lt;br /&gt;
 function alertOnTimeout(message, timeout) {&lt;br /&gt;
  return setTimeout(function() { &lt;br /&gt;
    // message будет доступен в безымянной функции, переданной таймауту&lt;br /&gt;
    alert(message); &lt;br /&gt;
  }, timeout);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Передача кода по старинке — строкой, которая прогоняется через eval() — не попадает под это правило, код исполняется в той области видимости, где и определен.&lt;br /&gt;
&lt;br /&gt;
Поскольку объекты в Javascript — это тоже типа функции, то свойство объекта определяется точно так же, как и переменная.&lt;br /&gt;
&lt;br /&gt;
 function myObject() {&lt;br /&gt;
  var property = 0;&lt;br /&gt;
  // Cамо собой, property будет доступно только внутри объекта.&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
А еще в Javascript область видимости переменной ограничивается только функциями, а не блоками типа if (привет, Паскаль). Потому удобнее всего объявлять переменные в начале функции.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== this ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
А что this? А то, что эта переменная автоматически появляется в методах объектов и затирает значение this из предыдущей области видимости. Решение простое — переприсваивать ее значение другой переменной. &lt;br /&gt;
&lt;br /&gt;
 $('div.with-links').click(function() {&lt;br /&gt;
  var theDiv = this; //сохраняем значение this&lt;br /&gt;
  $(this).find('a').click(function() {&lt;br /&gt;
    alert($(this).attr('href')); // this - это ссылка&lt;br /&gt;
    theDiv.remove(); // а theDiv - это все еще дивак&lt;br /&gt;
  });&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Отдельно замечу, что при оборачивании какой-то поведенческой логики в объект надо помнить, что в создаваемых DOM-событиях значение this самого объекта теряется. &lt;br /&gt;
&lt;br /&gt;
 function myObject() {&lt;br /&gt;
  var _this = this; // сохраняем ссылку на родительский объект&lt;br /&gt;
  var linkRemoved = false;&lt;br /&gt;
&lt;br /&gt;
  $('a').click(function() {&lt;br /&gt;
    $(this).remove(); // this - это объект ссылки&lt;br /&gt;
    _this.linkRemoved = true; // _this - это родительский объект&lt;br /&gt;
  });&lt;br /&gt;
 }&lt;/div&gt;</summary>
		<author><name>imported&gt;Supportadmin</name></author>
	</entry>
</feed>