Возможно ли "var"?
myObj = 1;
так же, как?
var myObj = 1;
Я нашел, что они оба работают из моего теста, я предполагаю, что var
является необязательным. Правильно ли это?
Возможно ли "var"?
myObj = 1;
так же, как?
var myObj = 1;
Я нашел, что они оба работают из моего теста, я предполагаю, что var
является необязательным. Правильно ли это?
Они означают разные вещи.
Если вы используете 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 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
даже для глобальных переменных.
var
является необязательным. var
помещает переменную в локальную область. Если переменная определена без 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
) рассматривается как свойства глобального объекта. (Обычно объект window
, если вы не находитесь в блоке with
)
Переменные, объявленные с помощью var
, являются обычными локальными переменными и не видны вне функции, в которой они объявлены. (Обратите внимание, что Javascript не имеет области блока)
Ключевое слово var в Javascript для этой цели.
Если вы объявляете переменную без ключевого слова var, например:
myVar = 100;
Он становится глобальной переменной, доступ к которой возможен из любой части вашего script. Если вы не сделали это намеренно или не знаете об этом, это может вызвать у вас боль, если вы повторно используете имя переменной в другом месте вашего javascript.
Если вы объявите переменную с ключевым словом var, например:
var myVar = 100;
Он локален для области ({] - фигурные скобки, функция, файл, в зависимости от того, где вы ее разместили).
Это более безопасный способ обработки переменных. Поэтому, если вы не делаете этого, попробуйте объявить переменную с ключевым словом var и не без нее.
Посмотрите этот скрипт: 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
Рассмотрим этот вопрос, заданный сегодня в StackOverflow:
Хороший тест и практический пример - это то, что происходит в приведенном выше сценарии...
Разработчик использовал имя функции JavaScript в одной из своих переменных.
Какая проблема с кодом?
Код работает только при первом нажатии пользователем кнопки.
Какое решение?
Добавьте ключевое слово var
перед именем переменной.
Var не позволяет вам, программисту, объявлять переменную, потому что Javascript не имеет переменных. Javascript имеет объекты. Var объявляет имя объекту undefined, явно. Назначение назначает имя в качестве дескриптора объекту, которому было присвоено значение.
Использование var сообщает интерпретатору Javacript две вещи:
Запрет 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/#sthash.xNnLrwc3.dpuf