Why doesn't this job raise a ReferenceError?

We consider three cases, where aand kundefined:

if (a) console.log(1); // ReferenceError

and

var a = k || "value"; // ReferenceError

seems reasonable, but ...

var a = a || "value"; // "value"

Why doesn't the last case throw ReferenceError? Is it tied ato its definition?

+4
source share
3 answers

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); //logs 3
}

Versus:

function foo() {
    {
        let a = 3;
    }
    console.log(a); //ReferenceError
}
+12
var a = k || 'value';
var a = a || 'value';

a , var a, k , - ReferenceError, - "value"

0
if (a) console.log(1); // ReferenceError

, , , , refrence

var a = k || "value"; //ReferenceError

k ,

var a = a || "value"; //"value"

, a (a r.h.s), a , ,

, undefined

refrence - ,

undefined - javascript, , undefined , ,

-1

Source: https://habr.com/ru/post/1665574/


All Articles