Какова цель ключевого слова var и когда следует его использовать (или опускать)?
Описание проблемы:
Я изучаю JavaScript и хотел бы понять, какую именно функцию выполняет ключевое слово var
и в чем разница между следующими двумя подходами:
var someNumber = 2;
var someFunction = function() { doSomething; }
var someObject = { }
var someObject.someProperty = 5;
и
someNumber = 2;
someFunction = function() { doSomething; }
someObject = { }
someObject.someProperty = 5;
Когда следует использовать одно из этих решений и почему? Что в итоге происходит в каждом из случаев?
Также хочется уточнить, что данный вопрос рассматривается с точки зрения ECMAScript версии 3 или 5, и ответы могут устареть с выходом новых возможностей ECMAScript 6.
5 ответ(ов)
Сказать, что разница заключается в "локальном" и "глобальном", не совсем точно.
Лучше рассматривать это как разницу между "локальным" и "ближайшим". Ближайшее может быть глобальным, но это не всегда так.
/* глобальная область видимости */
var local = true;
var global = true;
function outer() {
/* локальная область видимости */
var local = true;
var global = false;
/* ближайшая область видимости = outer */
local = !global;
function inner() {
/*nearest scope = outer */
local = false;
global = false;
/* ближайшая область видимости = undefined */
/* по умолчанию создается глобальная переменная */
public = global;
}
}
В этом примере переменные local
и global
внутри функции outer
и inner
имеют разные значения по сравнению с глобальными переменными. При этом, когда мы присваиваем значение переменной local
в функции, компилятор будет искать ближайшую область видимости, а не глобальную. Это может привести к путанице, особенно если вы ожидаете, что доступ будет только глобальным.
Ваш код содержит ошибку из-за того, что переменная i
не объявлена с помощью var
, let
или const
. В результате она становится глобальной переменной, что может привести к неожиданным результатам. Вот пример, как это может произойти:
<script>
one();
function one()
{
for (i = 0; i < 10; i++)
{
two();
alert(i);
}
}
function two()
{
i = 1; // Здесь мы присваиваем `i` значение 1
}
</script>
Из-за отсутствия объявления переменной i
в функции one
, в каждой итерации цикла for
i
будет сбрасываться в 1 после выполнения функции two
. Это приведет к бесконечному циклу, так как i
никогда не будет достигать значения 10. Чтобы исправить код, нужно объявить i
локально внутри функции one
, например, так:
function one() {
for (var i = 0; i < 10; i++) { // Используем var, чтобы объявить i локально
two();
alert(i);
}
}
Теперь, когда i
объявлена с помощью var
, она будет локальной для функции one
, и код будет работать как задумано, выводя значения от 0 до 9.
Я бы сказал, что в большинстве случаев лучше использовать var
.
Локальные переменные всегда быстрее, чем переменные в глобальной области видимости.
Если вы не используете var
для объявления переменной, то переменная окажется в глобальной области видимости.
Для получения дополнительной информации вы можете поискать в Google "scope chain JavaScript".
Не используйте var
!
var
- это способ объявления переменной до ES6. Мы сейчас в будущем, и вам следует писать код соответственно.
Используйте const
и let
const
следует использовать в ~95% случаев. Он делает так, что ссылка на переменную не может изменяться, поэтому свойства массивов, объектов и узлов DOM могут изменяться, и их лучше объявлять как const
.
let
следует использовать для любых переменных, которые ожидается переназначить. Это включает в себя и переменные в циклах. Если вы когда-либо пишете varName =
после инициализации, используйте let
.
Оба имеют блочную область видимости, как и ожидается в большинстве других языков.
В данном примере разница заключается в том, как происходит присваивание переменной a
и что происходит, если переменная не была ранее объявлена.
В первом случае:
var a = a || []; // работает
Мы используем ключевое слово var
, чтобы объявить переменную a
. Если переменная a
уже существует, то ей присваивается её текущее значение. Если она не инициализирована (то есть равна undefined
), то ей будет присвоен новый массив []
. В этом случае, даже если переменная a
не была объявлена ранее, код не вызовет ошибку, так как var
поднимает переменную (hoisting) и присваивает ей значение undefined
до выполнения строки.
Во втором случае:
a = a || []; // ошибка "a is undefined"
Здесь мы пытаемся присвоить дополнительное значение переменной a
, не объявив её заранее. Если a
не была объявлена ранее, JavaScript выбросит ошибку ReferenceError
, так как мы не можем обращаться к переменной, которая не была создана. Поэтому, прежде чем использовать a
в выражении, вам нужно убедиться, что она была объявлена где-то в коде.
Таким образом, основное различие в том, что использование var
позволяет избежать ошибки при обращении к необъявленной переменной, в то время как просто присвоение значения вызовет ошибку, если переменная не существует.
Где найти документацию по форматированию даты в JavaScript?
В чем разница между String.slice и String.substring?
Проверка соответствия строки регулярному выражению в JS
Что значит 'synchronized'?
Как создать диалог с кнопками "Ок" и "Отмена"