When it's able to pick up w from the outer scope, why is it not able to pick up z?
var w = 1, z = 2;
function foo( x = w + 1, y = x + 1, z = z + 1 ) {
console.log( x, y, z );
}
foo();
When it's able to pick up w from the outer scope, why is it not able to pick up z?
var w = 1, z = 2;
function foo( x = w + 1, y = x + 1, z = z + 1 ) {
console.log( x, y, z );
}
foo();
it's able to pick up
wfrom the outer scope
Yes, because you don't have a variable w inside your function.
why is it not able to pick up
z?
Because your parameter declares a local variable with the name z, and that shadows the global one. However, the local one is not yet initialised with a value inside the default expression, and throws a ReferenceError on accessing it. It's like the temporal dead zone for let/const,
let z = z + 1;
would throw as well. You should rename your variable to something else to make it work.
The first one works because the w in the w + 1 looks for w in the formal parameters but does not find it and the outer scope is used. Next, The x in the x +1 finds the value for x in formal parameters scope and uses it, so the assignment to y works fine.
In the last case of z + 1, it finds the z as not yet initialized in the formal parameter scope and throws an error before even trying to find it from outer scope.
Changing the variable z to something else as pointed out by @bergi, should do the trick.
var w = 1, z = 2;
function foo( x = w + 1, y = x + 1, a = z + 1 ) {
console.log( x, y, a );
}
foo();
you have
function foo( x = w + 1, y = x + 1, z = z + 1 )
during
x=w+1
x is undfined
and then w is undefined also
so it look into local execution context didnt find any value
so it goes outerscope and find w=1
so in local space w also become 1
now during
z = z + 1
the z which is at the left side of = is undefine
and then the z which is at the right side of = also undifine so it looks for
z inside local execution context and find one the z which was at the left side
of the equation so it do not need to go to outer space.
so z become undifine
however if you write this way z=this.z+1 you will get z= 3
cause this.z wont look into localscope directly go to outerscope and find z=2