does not quite understand what the subject wants to ask. It can only be said that if b
has not been declared before, then this writing will cause jvm
to declare b
for you in non-strict mode, and then assign a value. In strict mode, an error will be reported directly, but there is no declaration after all. If b
was previously declared in the outer or current layer scope, then only the original b
value has been modified.
it is recommended to check the strict Mode.
in addition, I seem to have heard that jvm
will declare the variables in a script before executing it. This passage is based on my impression and is for reference only.
Of course, the output of
b
will report an error, because you haven't declared b
at the time of output, unless you console.log (b = 1)
, then you will declare b
before output. Even if jvm
will take a look at the code for you and find that you declare b
below, it will help you declare in advance that b
is not in line with the program specification, and no normal, production program will be used first and then declared.
give a straightforward example
function Example(){
var a = 1 //
}
(function(){
b=1
})()
(window) b var b;
a can be printed because the variable is promoted, b is not declared, so it will look up for the value of the variable named b, because it has not been declared before, it can not be found in the stack, so it will report an error.
when the code executes to b, the unwritten var, will look up to see if there is a definition. If so, the expression will be assigned. If no corresponding variable is found at the top level, b will be used as the attribute of the windows object and assigned.
:
An obj, as a global variable is printed before it is declared, and when it is found, undefined,
is then declared and assigned, in the printout {}, the final output underlined is the return value of var obj = new Object ().
due to variable promotion, although the first line of code does not define obj, it is actually split into this at run time
var obj = undefined// global variable declare
console.log (obj) / / undefined
obj = new Object () / / variable assign
console.log (obj) / / {}
as for b, there is no declaration for him in the code, and of course it will not be promoted, but when it runs here, it will look up as if b had already lived in the previous part, and when you find the top layer, that is, the window object, um, hang it to XD
.
-
look at it this way, an is declared, but not defined
var a;
console.log(a); // undefined
console.log(b); // b
b = 10;
a = 20;
- b is not defined and is directly mounted under window
.
unwritten var,js looks for the variable in the current context, and mounts it into window if it is not defined, and if so, it is a global variable. That's it
first of all, the variable initialization phase, var a, currently has only a. Then we enter the code block execution phase, where console.log (a) is the a variable that already exists, with a value of undefined. B does not exist