Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

assignment in javascript and the var keyword

I was reading the 'learning Node' book and I was stuck in a very simple issue, one that I haven't given too much thought about: assignment in javascript.

The author states that we should realize that by using the Node's REPL, the following would return undefined:

var a = 2
(undefined)

while the code below will return '2' in the REPL:

a = 2
2

why is that? the code right above is not an attribution? how come? If the var 'a' hasn't existed until that point in the code, how come it is not and attribution?

like image 248
Draconar Avatar asked Nov 01 '12 15:11

Draconar


People also ask

Can var be assigned JavaScript?

Variables can be declared and initialize without the var keyword. However, a value must be assigned to a variable declared without the var keyword.

What is var keyword in JavaScript?

var is the keyword that tells JavaScript you're declaring a variable. x is the name of that variable.

What is variable assignment JavaScript?

Assignment (=) The simple assignment operator ( = ) is used to assign a value to a variable. The assignment operation evaluates to the assigned value. Chaining the assignment operator is possible in order to assign a single value to multiple variables.

What happens if you assign a variable without a keyword?

Undeclared variables In this case, the code will throw a ReferenceError as the variable is not declared using var keyword. In short, if we access any undeclared variable, the code will cause runtime error.


2 Answers

Per ECMA-262 § 12.2, a VariableStatement (that is, var identifier=value) explicitly returns nothing. Additionally, a VariableStatement is a Statement; Statements do not return values, and it is invalid to put a Statement somewhere an Expression would go.

For example, none of the following make sense because they put a Statement where you need value-yielding Expressions:

var a = var b;
function fn() { return var x; }

Per § 11.13.1, assignment to a variable (identifier=value) returns the assigned value.


When you write var a = 1;, it declares a and initalizes its value to 1. Because this is a VariableStatement, it returns nothing, and the REPL prints undefined.

a=1 is an expression that assigns 1 to a. Since there is no a, JavaScript implicitly creates a global a in normal code (but would throw a ReferenceError in strict mode, since you're not allowed to implicitly create new globals in strict mode).

Regardless of whether or not a existed before, the expression still returns the assigned value, 1, so the REPL prints that.

like image 67
josh3736 Avatar answered Sep 30 '22 14:09

josh3736


Just guessing here - this could probably be verified by referring to the ECMAScript 5th Edition spec (but man that thing is a pain) - it probably has to do with the specification of the "var" statement vs assigning attributes to the "global" object.

When you declare a variable and assign a value to it (var a=2) the returned value is likely "undefined" because that's what the spec says the "var" statement should return.

When you assign a variable to a symbol without using the "var" statement you are actually assigning a value to an attribute of the global object of that name. That is, a=2 is the same as saying window.a=2 and we know that assinging a value to an attribute returns the value assigned.

like image 34
maerics Avatar answered Sep 30 '22 13:09

maerics