В чем разница между определением переменной и объявлением в 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 принимает каждое объявление переменной и функции и выводит его в начало (из его соответствующей области), затем стекает, назначая их по порядку.

Похоже, вы уже знаете об этом. Здесь большой ресурс, если вы хотите продвинуться вперед, углубленное исследование. Тем не менее у меня такое чувство, что вы были там раньше.

Сад 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