var 声明变量的特点:没有块级作用域、存在变量提升 。没有块级作用域,使 var 声明的变量在 if 语句外可以被访问 存在变量提升,使 var 声明的变量提升到当前作用域的顶部

发布时间 2023-11-16 12:45:27作者: 龙陌

请问函数test最终输出的值是多少?

var a = 1;
function test() {
    console.log(a);
    if(false) {
        var a = 2;
    }
}
test();

A
1

B
2

C
undefined

D
null

正确答案:C

Javascript分为预处理阶段和执行阶段,尽管if里面的语句不会被执行,但是在预处理阶段还是会将其提升,因此最终还是undefined。
函数会先去找自己内部的变量,内部有就不会往外面找,内部没有才去外面找

var a = 1;
function test() {
    console.log(a);
    if(false) {
        var a = 2;
    }
}
test();
  
//其实代码执行过程如下:
var a ;
a = 1;
function test() { //函数会先去找自己内部的变量,内部有就不会往外面找,内部没有才去外面找
    var a; //变量提升
    console.log(a);
    if(false) { //因为false没有满足if的条件,所以不能进入if语句里进行赋值
        a = 2;    //if语句的条件把false改成true,就可以进入if语句赋值
    }
}
test();

var 声明变量的特点:没有块级作用域、存在变量提升

没有块级作用域,使 var 声明的变量在 if 语句外可以被访问      
存在变量提升,使 var 声明的变量提升到当前作用域的顶部,即 test 函数内的顶部     

在 test 函数作用域中,局部变量 a 覆盖了全局变量 a      
变量提升只提升声明而不提升赋值,故此时 a 的值为 undefined,随后打印输出