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

1483
задан Peter Mortensen 7 February 2018 в 18:26
поделиться

9 ответов

Если вы находитесь в глобальной области видимости, особой разницы нет. Прочтите ответ Кангакса для объяснения

Если вы находитесь в функции, тогда var создаст локальную переменную, «no var» будет искать в цепочке областей видимости, пока не найдет переменную. или попадает в глобальную область видимости (после чего она создается):

// These are both globals
var foo = 1;
bar = 2;

function()
{
    var foo = 1; // Local
    bar = 2;     // Global

    // Execute an anonymous function
    (function()
    {
        var wibble = 1; // Local
        foo = 2; // Inherits from scope above (creating a closure)
        moo = 3; // Global
    }())
}

Если вы не выполняете присваивание, вам нужно использовать var :

var x; // Declare x
1330
ответ дан 22 November 2019 в 20:15
поделиться

Помимо проблемы объемов, некоторые люди также упоминают подъем , но никто не дал пример. Вот один для глобальной области видимости:

console.log(noErrorCase);
var noErrorCase = "you will reach that point";

console.log(runTimeError);
runTimeError = "you won't reach that point";
0
ответ дан 22 November 2019 в 20:15
поделиться

Без var - глобальная переменная.

Настоятельно рекомендуется ВСЕГДА использовать оператор var , потому что глобальная переменная init в местный контекст - зло. Но если вам нужен этот подвох, вы должны написать комментарий в начале страницы:

/* global: varname1, varname2... */
8
ответ дан 22 November 2019 в 20:15
поделиться

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

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

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

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

11
ответ дан 22 November 2019 в 20:15
поделиться

Вот довольно хороший пример того, как вы можете попасть в ловушку, если не объявляете локальные переменные с помощью var :

<script>
one();

function one()
{
    for (i = 0;i < 10;i++)
    {
        two();
        alert(i);
    }
}

function two()
{
    i = 1;
}
</script>

( i сбрасывается в каждая итерация цикла, так как он не объявлен локально в for цикл, а глобально) в конечном итоге приводит к бесконечному циклу

28
ответ дан 22 November 2019 в 20:15
поделиться

Всегда используйте ключевое слово var для объявления переменных. Почему? Хорошая практика кодирования сама по себе должна быть достаточной причиной, но ее отсутствие означает, что она объявлена ​​в глобальной области (такая переменная называется «подразумеваемой» глобальной). Дуглас Крокфорд рекомендует никогда не использовать подразумеваемые глобальные переменные , и в соответствии с рекомендациями Apple по кодированию JavaScript :

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

40
ответ дан 22 November 2019 в 20:15
поделиться

Когда Javascript выполняется в браузере, весь ваш код окружается оператором with, например:

with (window) {
    //Your code
}

Дополнительная информация о с - MDN

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

разница возникает, когда вы находитесь не непосредственно внутри окна, например внутри функции или внутри блока.

Использование var позволяет скрыть внешние переменные с одинаковыми именами. Таким образом, вы можете имитировать «частную» переменную, но это уже другая тема.

Практическое правило - всегда использовать var , потому что в противном случае вы рискуете внести небольшие ошибки.

РЕДАКТИРОВАТЬ: После полученных мной критических замечаний я хотел бы подчеркнуть следующее:

  • var объявляет переменную в текущей области
  • Глобальной областью является окно
  • Не используется var неявно объявляет var в глобальной области (окне)
  • Объявление переменной в глобальной области (окне) с использованием var аналогично ее пропуску.
  • Объявление переменной в областях, отличных от окна, с использованием var - это не то же самое , что объявление переменной без var
  • Всегда объявляйте var явно, потому что это хорошо практика
79
ответ дан 22 November 2019 в 20:15
поделиться

Есть разница .

var x = 1 объявляет переменную x в текущей области (также известной как контекст выполнения). Если объявление появляется в функции - объявляется локальная переменная; если он находится в глобальной области видимости - объявляется глобальная переменная.

x = 1 , с другой стороны, просто присвоение свойств. Сначала он пытается разрешить x в цепочке областей видимости. Если он находит его где-нибудь в этой цепочке областей видимости, он выполняет присваивание; если он не находит x , только тогда создает свойство x для глобального объекта (который является объектом верхнего уровня в цепочке областей видимости).

Теперь обратите внимание, что он не объявляет глобальную переменную, а создает глобальное свойство.

Разница между ними тонкая и может сбивать с толку, если вы не понимаете, что объявления переменных также создают свойства (только для объекта переменной) и что каждое свойство в Javascript (ну, ECMAScript) имеет определенные флаги. которые описывают их свойства - ReadOnly, DontEnum и DontDelete.

Поскольку объявление переменной создает свойство с флагом DontDelete, разница между var x = 1 и x = 1 (при выполнении в глобальной области) заключается в том, что первое объявление переменной создает свойство DontDelete'able, а второе - нет. Как следствие, свойство, созданное с помощью этого неявного присвоения, затем может быть удалено из глобального объекта, а первое свойство, созданное с помощью объявления переменной, не может быть удалено.


[Обновление 2010/12/16]

В ES5 (ECMAScript 5; недавно стандартизованная, 5-я редакция языка) есть так называемый «строгий режим» - языковой режим выбора, который немного меняет поведение незаявленных назначений. В строгом режиме присвоение необъявленному идентификатору - это ReferenceError . Причиной этого было обнаружение случайных назначений, предотвращающих создание нежелательных глобальных свойств. Некоторые из новых браузеров уже начали поддержку строгого режима. См., Например, мою таблицу совместимости .

731
ответ дан 22 November 2019 в 20:15
поделиться

Сказать, что это разница между « local и global », не совсем верно.

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

/* global scope */
var local = true;
var global = true;

function outer() {
    /* local scope */
    var local = true;
    var global = false;

    /* nearest scope = outer */
    local = !global;

    function inner() {
        /* nearest scope = outer */
        local = false;
        global = false;

        /* nearest scope = undefined */
        /* defaults to defining a global */
        public = global;
    }
}
133
ответ дан 22 November 2019 в 20:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: