Использование 'var' для объявления переменных необязательно?

Является ли "вар" необязательным?

myObj = 1;

такой же как?

var myObj = 1;

Я обнаружил, что они оба работают из моего теста, я полагаю, var не является обязательным. Это правильно?

14 ответов

Решение

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

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

Это одна из хитрых частей Javascript, но также и одна из его основных функций. Переменная, объявленная с var "начинает свою жизнь" именно там, где вы это заявляете. Если вы пропустите var это как если бы вы говорили о переменной, которую вы использовали ранее.

var foo = 'first time use';
foo = 'second time use';

Что касается области видимости, то неверно, что переменные автоматически становятся глобальными. Скорее Javascript будет проходить по цепочке областей видимости, чтобы увидеть, использовали ли вы эту переменную ранее. Если он найдет экземпляр переменной с тем же именем, что и раньше, он будет использовать его и любую область, в которой он был объявлен. Если он нигде не встретит переменную, он в конечном итоге попадет в глобальный объект (window в браузере) и прикрепит к нему переменную.

var foo = "I'm global";
var bar = "So am I";

function () {
    var foo = "I'm local, the previous 'foo' didn't notice a thing";
    var baz = "I'm local, too";

    function () {
        var foo = "I'm even more local, all three 'foos' have different values";
        baz = "I just changed 'baz' one scope higher, but it's still not global";
        bar = "I just changed the global 'bar' variable";
        xyz = "I just created a new global variable";
    }
}

Такое поведение действительно мощно при использовании с вложенными функциями и обратными вызовами. Узнавать о чем functions как и как работает видимость - самая важная вещь в Javascript.

Нет, они не эквивалентны.

С myObj = 1; вы используете глобальную переменную.

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

Попробуйте следующий код, чтобы понять различия:

external = 5;
function firsttry() {
  var external = 6;
  alert("first Try: " + external);
}

function secondtry() {
  external = 7;
  alert("second Try: " + external);
}

alert(external); // Prints 5
firsttry(); // Prints 6
alert(external); // Prints 5
secondtry(); // Prints 7
alert(external); // Prints 7

Вторая функция изменяет значение глобальной переменной "external", а первая - нет.

Это немного больше, чем просто локальный против глобального. Глобальные переменные, созданные с var отличаются от тех, которые созданы без. Учти это:

var foo = 1; // declared properly
bar = 2; // implied global
window.baz = 3; // global via window object

Основываясь на ответах, эти глобальные переменные, foo, bar, а также baz все эквивалентны. Это не тот случай. Глобальные переменные сделаны с var (правильно) назначен внутренний [[DontDelete]] свойство, такое, что они не могут быть удалены.

delete foo; // false
delete bar; // true
delete baz; // true

foo; // 1
bar; // ReferenceError
baz; // ReferenceError

Вот почему вы должны всегда использовать varдаже для глобальных переменных.

Вокруг этой темы так много путаницы, и ни один из существующих ответов не охватывает все ясно и прямо. Вот несколько примеров с комментариями.

//this is a declaration
var foo;

//this is an assignment
bar = 3;

//this is a declaration and an assignment
var dual = 5;

Объявление устанавливает флаг DontDelete. Назначение не.

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

Переменная, назначенная, но не объявленная, будет искать область, к которой нужно присоединиться. Это означает, что он будет проходить по пищевой цепочке области видимости, пока не будет найдена переменная с тем же именем. Если ничего не найдено, оно будет прикреплено к области верхнего уровня (которая обычно называется глобальной).

function example(){
  //is a member of the scope defined by the function example
  var foo;

  //this function is also part of the scope of the function example
  var bar = function(){
     foo = 12; // traverses scope and assigns example.foo to 12
  }
}

function something_different(){
     foo = 15; // traverses scope and assigns global.foo to 15
}

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

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

редактировать

Я думал, что не удаляемая часть была верна в определенный момент времени в определенной среде. Я, должно быть, мечтал об этом.

Они не то же самое.

Необъявленная переменная (без var) рассматриваются как свойства глобального объекта. (Обычно window объект, если вы не в with блок)

Переменные, объявленные с var являются обычными локальными переменными и не видны за пределами функции, в которой они объявлены. (Обратите внимание, что Javascript не имеет области видимости блока)

Проверьте эту скрипку: http://jsfiddle.net/GWr6Z/2/

function doMe(){

a = "123"; // will be global
var b = "321"; // local to doMe
alert("a:"+a+"  --  b:"+b);

b = "something else"; // still local (not global)
alert("a:"+a+"  --  b:"+b);

};


doMe()
alert("a:"+a+"  --  b:"+b); // `b` will not be defined, check console.log

Ключевое слово var в Javascript предназначено для этой цели.

Если вы объявляете переменную без ключевого слова var, вот так:

myVar = 100;

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

Если вы объявите переменную с ключевым словом var, например:

var myVar = 100;

Он является локальным для области ({] - фигурные скобки, функция, файл, в зависимости от того, где вы его разместили).

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

Рассмотрим этот вопрос, заданный сегодня в Stackru:

Простой Javascript вопрос

Хороший тест и практический пример - то, что происходит в вышеупомянутом сценарии...
Разработчик использовал имя функции JavaScript в одной из своих переменных.

В чем проблема с кодом?
Код работает только в первый раз, когда пользователь нажимает кнопку.

Какое решение?
Добавить var Ключевое слово перед именем переменной.

Var не позволяет вам, программисту, объявлять переменную, потому что в Javascript нет переменных. У Javascript есть объекты. Var явно объявляет имя неопределенному объекту. Присвоение присваивает имя как дескриптор объекту, которому присвоено значение.

Использование var сообщает интерпретатору Javacript две вещи:

  1. не использовать делегирование обратного поиска для имени, вместо этого используйте это
  2. не удалять имя

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

Var как ключевое слово возникло из-за неправильного решения дизайнера языка почти так же, как Javascript как имя возникло из-за неправильного решения.

пс. Изучите примеры кода выше.

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

console.out(var myObj=1);
//SyntaxError: Unexpected token var
console.out(myObj=1);
//1

Что-то, что-то утверждение против выражения

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

Я только что нашел ответ на форуме, на который ссылается один из моих коллег. Если вы объявляете переменную вне функции, она всегда глобальная. Неважно, используете ли вы ключевое слово var или нет. Но если вы объявляете переменную внутри функции, она имеет большую разницу. Внутри функции, если вы объявите переменную с помощью ключевого слова var, она будет локальной, но если вы объявите переменную без ключевого слова var, она будет глобальной. Он может перезаписать ваши ранее объявленные переменные. - Подробнее см.: http://forum.webdeveloperszone.com/question/what-is-the-difference-between-using-var-keyword-or-not-using-var-during-variable-declaration/

Другие вопросы по тегам