参见英文答案 >
Why is my global variable shadowed before the local declaration?3
我正在以3种方式修改一段代码.在这3个条件下行为不同.请描述它是如何执行的?
我正在以3种方式修改一段代码.在这3个条件下行为不同.请描述它是如何执行的?
var a=1; function myFunc(){ console.log(a); console.log(a) } myFunc(); //Output is: 1 1 var a=1; function myFunc(){ console.log(a); var a=2; console.log(a) } myFunc(); //Output is: undefined 2 var a=1; function myFunc(){ console.log(a); var a=2; console.log(a) } myFunc(a); //Output is: undefined 2
为什么在第二种情况下打印未定义?在第三种情况下,我发送我的全局作为一个参数,那么它也是打印未定义的.
解决方法
这是因为JavaScript将var声明移动到范围的顶部,因此您的代码实际上是:
var a = 1; function myFunc(){ var a; // a is redeclared,but no value is assigned console.log(a); // therefore it evaluates to undefined a = 2; // now a = 2 console.log(a); // and then it logs to 2 } myFunc();
这个行为叫做Variable Hoisting.
编辑
正如Beterraba所说,在第三个代码中,它记录未定义,因为在函数的头中没有声明参数:
var a = 1; function myFunc(a) { // a is declared console.log(a); // now a logs 1 var a = 2; // now a = 2 console.log(a); } myFunc(a);