- var和function在函数外就是window对象的,在函数内并不是window对象的,属于局部变量
- var和function不论在函数外还是内都具有变量提升的特性
- 未声明直接定义(赋值)不论在函数外还是内都是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。