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

Возможно ли "var"?

myObj = 1;

так же, как?

var myObj = 1;

Я нашел, что они оба работают из моего теста, я предполагаю, что var является необязательным. Правильно ли это?

Ответ 1

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

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

Ответ 2

Это одна из сложнейших частей 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 still not global";
        bar = "I just changed the global 'bar' variable";
        xyz = "I just created a new global variable";
    }
}

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

Ответ 3

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

С помощью 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", но первая функция не работает.

Ответ 4

Там немного больше, чем просто локальный или глобальный. Глобальные переменные, созданные с помощью 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 даже для глобальных переменных.

Ответ 5

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

изменить

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

Ответ 6

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

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

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

Ответ 7

Они не совпадают.

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

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

Ответ 8

Ключевое слово var в Javascript для этой цели.

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

myVar = 100;

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

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

var myVar = 100;

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

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

Ответ 9

Посмотрите этот скрипт: 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

Ответ 10

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

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

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

Какая проблема с кодом?
Код работает только при первом нажатии пользователем кнопки.

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

Ответ 11

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

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

  • не использовать делегирование обратного обхода искать значение для имени, вместо этого используйте
  • не удалять имя

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

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

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

Ответ 12

Все, что касается сферы действия, можно использовать по-разному.

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

Что-то что-то говорит против выражения

Ответ 13

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

Ответ 14

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