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


ЗАМЕТКА : Этот вопрос задавался с точки зрения ECMAScript версии 3 или 5. Ответы могут устареть с введением новых функций в выпуске ECMAScript 6.


1379


источник


Ответы:


Если вы находитесь в глобальной области, то нет никакой разницы.

Если у вас есть функция, тогда 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

1246



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

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

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

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

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

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

Но это, конечно, теория, и на практике существуют еще большие различия между этими двумя , из-за различных ошибок в реализациях (например, из IE).

Надеюсь, что все это имеет смысл:)


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

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


693



Говоря, что это разница между " местный а также Глобальный «не совсем точно.

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

/* 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;
    }
}

129



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

with (window) {
    //Your code
}

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

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

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

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

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

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

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

76



You should always use the var keyword to declare variables. Why? Good coding practice should be enough of a reason in itself, but declaring a variable without the var keyword means it is declared in the global scope (a variable like this is called an "implied" global). Douglas Crockford recommends never using implied globals, and according to the Apple JavaScript Coding Guidelines:

Any variable created without the var keyword is created at the global scope and is not garbage collected when the function returns (because it doesn’t go out of scope), presenting the opportunity for a memory leak.

So, in short, always declare variables using the var keyword.


37



Here's quite a good example of how you can get caught out from not declaring local variables with var:

<script>
one();

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

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

(i is reset at every iteration of the loop, as it's not declared locally in the for loop but globally) eventually resulting in infinite loop


27



I would say it's better to use var in most situations.

Local variables are always faster than the variables in global scope.

If you do not use var to declare a variable, the variable will be in global scope.

For more information, you can search "scope chain JavaScript" in Google.


12



another difference e.g

var a = a || [] ; // works 

while

a = a || [] ; // a is undefined error.

8



Using var is always a good idea to prevent variables from cluttering the global scope and variables from conflicting with each other, causing unwanted overwriting.


7