Если вы находитесь в глобальной области видимости, особой разницы нет. Прочтите ответ Кангакса для объяснения
Если вы находитесь в функции, тогда 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
Помимо проблемы объемов, некоторые люди также упоминают подъем , но никто не дал пример. Вот один для глобальной области видимости:
console.log(noErrorCase);
var noErrorCase = "you will reach that point";
console.log(runTimeError);
runTimeError = "you won't reach that point";
Без var
- глобальная переменная.
Настоятельно рекомендуется ВСЕГДА использовать оператор var
, потому что глобальная переменная init в местный контекст - зло. Но если вам нужен этот подвох, вы должны написать комментарий в начале страницы:
/* global: varname1, varname2... */
Я бы сказал, что в большинстве ситуаций лучше использовать var
.
Локальные переменные всегда быстрее, чем переменные в глобальной области.
Если вы этого не сделаете. используйте var
для объявления переменной, переменная будет в глобальной области видимости.
Для получения дополнительной информации вы можете выполнить поиск «JavaScript цепочки областей видимости» в Google.
Вот довольно хороший пример того, как вы можете попасть в ловушку, если не объявляете локальные переменные с помощью var
:
<script>
one();
function one()
{
for (i = 0;i < 10;i++)
{
two();
alert(i);
}
}
function two()
{
i = 1;
}
</script>
( i
сбрасывается в каждая итерация цикла, так как он не объявлен локально в for
цикл, а глобально) в конечном итоге приводит к бесконечному циклу
Всегда используйте ключевое слово var
для объявления переменных. Почему? Хорошая практика кодирования сама по себе должна быть достаточной причиной, но ее отсутствие означает, что она объявлена в глобальной области (такая переменная называется «подразумеваемой» глобальной). Дуглас Крокфорд рекомендует никогда не использовать подразумеваемые глобальные переменные , и в соответствии с рекомендациями Apple по кодированию JavaScript :
любая переменная, созданная без
var
ключевое слово создается в глобальной области и не сборщик мусора, когда функция возвращает (потому что это не выходят за рамки), представляя возможность утечки памяти.
Когда Javascript выполняется в браузере, весь ваш код окружается оператором with, например:
with (window) {
//Your code
}
Дополнительная информация о с
- MDN
Поскольку var
объявляет переменную в текущей области , нет никакой разницы между объявлением var
внутри окна и ее отсутствием вообще.
разница возникает, когда вы находитесь не непосредственно внутри окна, например внутри функции или внутри блока.
Использование var
позволяет скрыть внешние переменные с одинаковыми именами. Таким образом, вы можете имитировать «частную» переменную, но это уже другая тема.
Практическое правило - всегда использовать var
, потому что в противном случае вы рискуете внести небольшие ошибки.
РЕДАКТИРОВАТЬ: После полученных мной критических замечаний я хотел бы подчеркнуть следующее:
var
объявляет переменную в текущей области окно
var
неявно объявляет var
в глобальной области (окне) var
аналогично ее пропуску. var
- это не то же самое , что объявление переменной без var
var
явно, потому что это хорошо практика Есть разница .
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 . Причиной этого было обнаружение случайных назначений, предотвращающих создание нежелательных глобальных свойств. Некоторые из новых браузеров уже начали поддержку строгого режима. См., Например, мою таблицу совместимости .
Сказать, что это разница между « 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;
}
}