javascript – 为什么这个奇怪的行为?

参见英文答案 > Why is my global variable shadowed before the local declaration?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);

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...