This is due to one of the var"functions" called hoisting . Link:
( ) , - , . , . "hoisting", , , , . ( )
, :
console.log(a);
var a = "foo";
, ReferenceError, , a , undefined. , , , , , , , :
var a;
console.log(a);
a = "foo";
, :
function foo() {
console.log(a);
var a = "foo";
}
, :
function foo() {
var a;
console.log(a);
a = "foo";
}
, , ECMAScript 2015 Language Specification:
13.3.2
A var , VariableEnvironment. Var , undefined .
[...]
, VariableDeclaration Initializer, Initializer s AssignmentExpression, VariableDeclaration, . ( )
, var , - ( ) VariableEnvironment, , , undefined. , , var, , .
, a , . , :
var a = a || "value";
:
var a;
a = a || "value";
, , - . JavaScript , , a . undefined. undefined false, a value.
, ReferenceError:
var a = k || "value";
:
var a;
a = k || "value";
. k , . , a k ReferenceError, .
var a = "123"; var a = a || "124"; // a = "123"?
ES2015 :
VariableEnvironment BindingIdentifier VariableDeclaration, .
: , . , :
var a = "123";
var a = a || "124";
:
var a;
a = "123";
a = a || "124";
a . a "123", "123", "123" .
ES2015, , -, var. , . , , let:
let a = a || "value";
ReferenceError. , , , (var, let const), let const . , let const , . :
function foo() {
{
var a = 3;
}
console.log(a);
}
Versus:
function foo() {
{
let a = 3;
}
console.log(a);
}