В чем разница между определением переменной и объявлением в JavaScript?
Является ли это определение переменной или декларация? И почему?
var x;
... а память зарезервирована для x после этого оператора?
РЕДАКТИРОВАТЬ: в C extern int x;
является объявлением, int x = 5;
это определение. Какой аналог в JS? Википедия говорит, что объявление выделяет память, а определение присваивает значение этой выделенной памяти.
ВТОРОЕ РЕДАКТИРОВАНИЕ: Я думаю, что объяснение @Deryck звучит великолепно, но есть некоторые выводы, которые не соответствуют его объяснению:
> var x;
undefined
> x
undefined // now it looks like x is defined to the value undefined
> y
ReferenceError: y is not defined
Если вывод ReferenceError
скажет, что y is not declared
это будет иметь смысл. Но часто я читаю, что у JS есть два ненулевых значения: null
и undefined
. Таким образом, var x
будет определением со значением undefined
.
Ответы
Ответ 1
var x
является объявлением , потому что вы не определяете какое значение оно имеет, но вы объявляете его существование и необходимость в памяти распределение.
var x = 1
является объявлением и определением, но разделяется с x
объявлен в начале, тогда как его определение выполняется в указанной строке (переменные назначения выполняются inline).
Я вижу, что вы уже понимаете концепцию hoisting
, но для тех, кто этого не делает, Javascript принимает каждое объявление переменной и функции и выводит его в начало (из его соответствующей области), затем стекает, назначая их по порядку.
Похоже, вы уже знаете об этом. Здесь большой ресурс, если вы хотите продвинуться вперед, углубленное исследование. Тем не менее у меня такое чувство, что вы были там раньше.
PS - ваша аналогия между переменными с переменными dec/def и JS была на месте. То, что вы читали в Википедии, было правильным.
Ответ 2
Объявление переменной похоже на сообщение компилятору (javascript) о том, что этот токен x
я хочу использовать позже. Он указывает на местоположение в памяти, но еще не содержит значения. то есть. это не undefined
var x;
определить его означает присвоить ему значение, которое вы можете сделать так:
x = 10; // defining a variable that was declared previously
или вот так:
var y = 20; // declaring and defining a variable altogether.
http://msdn.microsoft.com/en-us/library/67defydd(v=vs.94).aspx http://www.w3schools.com/js/js_variables.asp
Ответ 3
Я дам вам длинный ответ для лучшего объяснения.
Когда движок javascript не может найти определенную переменную в памяти, он выдаст ошибку. Точнее говоря, когда движок javascript (контекст выполнения) не может "ссылаться" на переменную в памяти, он выдаст ReferenceError
. Это не совсем то же самое, что и ошибка объявления, по крайней мере, в JavaScript.
Существует разница между not defined
ошибкой и значением undefined
.
Так делать
var a = undefined;
а также
var a;
оба будут регистрировать один и тот же результат, т.е. undefined
. Это потому, что когда вы просто делаете var a;
механизм javascript выделяет память для переменной и автоматически устанавливает для нее значение undefined
, что отличается от сообщения о том, что a
вообще не существует - в этом случае он выдаст ReferenceError
.
Подъемно
console.log(a); // undefined
var a = 'something';
будет регистрировать undefined
потому что движок javascript знает, что переменная, объявленная где-то в коде, означает, что движок javascript на самом деле что-то делает до того, как выполнит код, - одна из вещей, которую он делает, - поднимает переменные. Проще говоря, приведенный выше код такой же, как
var a; // hoisted (declared and defined the value 'undefined')
console.log(a); // undefined
a = 'something' // update the defined value to 'something'
Итак, да, объявление и определение происходят вместе в javascript (автоматически - если вы сами этого не делаете), и значение по умолчанию не undefined
.
ES6
Просто дополнительная заметка
const a;
выдаст SyntaxError
где необходим инициализатор (определение). const
- единственный раз, когда вам нужно объявить и определить вручную.
Ответ 4
var x, y, z;
var x;
var h = 4;
i = 4;
все вышеперечисленные глобальные переменные, если они помещены сверху, (вне любых функций)
Предположим, что javascript запускает функцию
function start() {
x = 5*5;
}
глобальная переменная x теперь равна 25
Где, как если бы var x; не был помещен вне каких-либо функций, эта переменная x была бы локальной для этой функции.
Ответ 5
Вы объявляете переменные JavaScript с ключевым словом var:
var carname;
После объявления переменная пуста (она не имеет значения).
Чтобы присвоить значение переменной, используйте знак равенства
var carname="Volvo";
В компьютерных программах переменные часто объявляются без значения. Значение может быть то, что должно быть рассчитано, или что-то, что будет предоставлено позже, например, ввод пользователя. Объявленная переменная без значения будет иметь значение undefined.
Переменная carname будет иметь значение undefined после выполнения следующего оператора:
var carname;
var hoisting
В JavaScript переменная может быть объявлена после использования.
bla = 2
var bla;
// ...
// is implicitly understood as:
var bla;
bla = 2;
По этой причине рекомендуется всегда объявлять переменную в верхней части функций. В противном случае это может привести к запутывающим случаям
When declaring a variable without assigning a value to it, there still needs to be some memory available for it, otherwise you cannot make a reference to the variable later in the program. I don't think it a noticeable amount of memory being used and won't make a difference.
Ответ 6
var x;
Это объявление переменной. В Js, если вы не присваиваете значение переменной в объявлении. По умолчанию он будет undefined
.
var x; // declaring x
console.log(x); // output: undefined
Но если вы даже не объявили переменную, попробуйте получить к ней доступ. Это говорит о том, что переменная не определена.
console.log(y); // Output: ReferenceError: y is not defined
Если вам нужен доступ к объектам между файлами JS, рекомендуется выставить один объект в глобальное пространство имен и объявить поля и методы для этого объекта.
Файл 1:
var myObject;
myObject.myField = "Field!";
Файл 2:
myObject.prototype.myFunction = function () {
return this.myField;
};
Я взял из действительно хорошей дискуссии: Эквивалент объявления C extern в JavaScript
https://github.com/ganqqwerty/123-Essential-JavaScript-Interview-Questions
Ответ 7
Проще говоря,
undefined означает, что значение переменной не определено.
не определено означает, что сама переменная не определена.
var x;//value is not defined. So, x//undefined
//y variable is not declared or defined. So, y//y is not defined