16

Какова цель ключевого слова var и когда следует его использовать (или опускать)?

11

Описание проблемы:

Я изучаю 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 ответ(ов)

1

Сказать, что разница заключается в "локальном" и "глобальном", не совсем точно.

Лучше рассматривать это как разницу между "локальным" и "ближайшим". Ближайшее может быть глобальным, но это не всегда так.

/* глобальная область видимости */
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 в функции, компилятор будет искать ближайшую область видимости, а не глобальную. Это может привести к путанице, особенно если вы ожидаете, что доступ будет только глобальным.

0

Ваш код содержит ошибку из-за того, что переменная 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.

0

Я бы сказал, что в большинстве случаев лучше использовать var.

Локальные переменные всегда быстрее, чем переменные в глобальной области видимости.

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

Для получения дополнительной информации вы можете поискать в Google "scope chain JavaScript".

0

Не используйте var!

var - это способ объявления переменной до ES6. Мы сейчас в будущем, и вам следует писать код соответственно.

Используйте const и let

const следует использовать в ~95% случаев. Он делает так, что ссылка на переменную не может изменяться, поэтому свойства массивов, объектов и узлов DOM могут изменяться, и их лучше объявлять как const.

let следует использовать для любых переменных, которые ожидается переназначить. Это включает в себя и переменные в циклах. Если вы когда-либо пишете varName = после инициализации, используйте let.

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

0

В данном примере разница заключается в том, как происходит присваивание переменной a и что происходит, если переменная не была ранее объявлена.

В первом случае:

var a = a || []; // работает

Мы используем ключевое слово var, чтобы объявить переменную a. Если переменная a уже существует, то ей присваивается её текущее значение. Если она не инициализирована (то есть равна undefined), то ей будет присвоен новый массив []. В этом случае, даже если переменная a не была объявлена ранее, код не вызовет ошибку, так как var поднимает переменную (hoisting) и присваивает ей значение undefined до выполнения строки.

Во втором случае:

a = a || []; // ошибка "a is undefined"

Здесь мы пытаемся присвоить дополнительное значение переменной a, не объявив её заранее. Если a не была объявлена ранее, JavaScript выбросит ошибку ReferenceError, так как мы не можем обращаться к переменной, которая не была создана. Поэтому, прежде чем использовать a в выражении, вам нужно убедиться, что она была объявлена где-то в коде.

Таким образом, основное различие в том, что использование var позволяет избежать ошибки при обращении к необъявленной переменной, в то время как просто присвоение значения вызовет ошибку, если переменная не существует.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь