变量问题

72 阅读1分钟
  1. var和function在函数外就是window对象的,在函数内并不是window对象的,属于局部变量
  2. var和function不论在函数外还是内都具有变量提升的特性
  3. 未声明直接定义(赋值)不论在函数外还是内都是window对象的,但不具有变量提升

字节原题

var a = 1;
function func() {
    console.log(a); // 输出:function a() {}
    a = 10;
    console.log(a); // 输出:10
    function a() {}
    var a = 20;
    console.log(a); // 输出:20
}
func();
console.log(a); // 输出:1

解释:function和var都会变量提升,但function优先级大,所以第一个a输出的是function。再给a赋值为10,那么第二个a输出的是10,这里a已经是局部变量了,所以a = 10只是赋值,而不是上述3的情况。var的a还未赋值,所以在此时进行赋值,a = 20,所以第三个a输出的是20。最后在函数外,a指的是window对象的,函数里并未涉及window对象的a的操作,所以第四个a输出的是1。

自己改编的题

var a = 1;

function func() {
    console.log(a); // 输出:1
    a = 10;
    console.log(a); // 输出:10
}

func();
console.log(a); // 输出:10

解释:函数内没有var和function,a = 10也不能变量提升,所以第一个a输出的是1,window对象的a。a = 10,之前没有局部变量的声明,相当于对window对象的a重新赋值为10,所以第二个a输出的是10。最后在函数外,由于window对象的a已重新赋值为10,不再为1了,所以第三个a输出的是10。