1 a = 'ghostwu';2 var a;3 console.log( a );
For the above example, you may think that the output result of the third line of code should be undefined, because the second line is var a; which declares the variable but does not assign a value, so a The value is undefined, but the correct result is ghostwu. As for why, please continue reading!
1 console.log( a );2 var a = 'ghostwu';
For the above example, the first line of code, you may think An error is reported because the a variable is not defined before a is output, but the correct result is undefined. Well, it seems a bit inexplicable.
To understand why, we must first clarify the following two points:
javascript code is not executed line by line.
javascript execution is divided into 2 steps:
Compilation (lexical interpretation/pre-interpretation)
Execution
Secondly, when we encounter var a = "ghostwu" to define a variable, js actually regards this sentence as a two-stage thing, var a occurs in In the compilation phase, a = 'ghostwu' occurs in the execution phase. Then var a will be promoted to the front of the current scope, a = 'ghostwu' stays in place waiting for the execution phase, so:
1 a = 'ghostwu';2 var a;3 console.log( a );4 5 //上面这段代码经过编译之后,变成下面这样6 7 var a; //被提升到当前作用域的最前面8 a = 'ghostwu'; //留在原地,等待执行9 console.log( a );
1 console.log( a ); 2 var a = 'ghostwu';3 4 //上面这段代码,经过编译之后,变成下面这样5 6 var a;7 console.log( a );8 a = 'ghostwu';
After reading the compiled code, do you understand?
Before going on to the following, let us first clarify the two common ways of defining functions:
1 //函数声明, 形如:2 function show(){3 console.log( '函数声明方式' );4 }5 6 //函数表达式, 形如:7 var show = function(){8 console.log( '表达式方式' );9 }
Because expressions and function declarations, during the compilation phase, will produce different interpretation effects.
1 show();2 function show(){3 console.log( a );4 var a = 'ghostwu';5 }
How to explain the above code during the compilation phase? Just remember the following sentence:
The function declaration will be promoted
So, after the above code is compiled, it becomes the following:
function show(){ //函数声明被提升到 当前作用域的最前面 var a; //var声明被提升到当前作用域的最前面, 注意,他不会提升到函数的外面, 因为当前的作用域是在函数中 console.log( a ); a = 'ghostwu'; } show();
So, the above result is undefined;
For function expressions, they will not be promoted. See the following example:
1 show(); //报错,show is not a function 2 var show = function(){ 3 console.log( 'ghostwu' ); 4 } 5 //对于上面这段表达式代码,经过编译之后: 6 var show; 7 show(); //执行之后就是 undefined(), 所以在表达式定义之前,调用函数报错了 8 show = function(){ 9 console.log( 'ghostwu' ); 10 }
1 show(); //你好2 var show;3 function show(){4 console.log( '你好' );5 }6 show = function(){7 console.log( 'hello' );8 }
Why is the result of the above code "Hello"?
Because: When a function declaration with the same name appears, When variables are declared, function declarations will be promoted first and variable declarations will be ignored. So after compilation, it becomes:
1 function show(){2 console.log( '你好' );3 }4 show(); //你好5 show = function(){6 console.log( 'hello' );7 }8 show();//如果这里在调用一次,就是hello, 因为show函数体在执行阶段 被 重新赋值了
If there is a function declaration with the same name, the later one will overwrite the previous one, as follows:
show(); console.log( 'hello' show = console.log( '你好' console.log( 'how are you!' console.log( 'how are you!' show(); show = console.log( '你好' show();
1 //思考题: 请问下面的结果是什么? 为什么? 写下你的答案 2 show(); 3 var a = true; 4 if( a ){ 5 function show(){ 6 console.log( 1 ); 7 } 8 }else { 9 function show(){10 console.log( 2 );11 }12 }
The above is the detailed content of ghostwu simple and easy to understand javascript variable promotion. For more information, please follow other related articles on the PHP Chinese website!