一道js变量上浮面试题
function a() { var a = 1; function b() { a = 10; return; function a() {} } b(); log(a); } a();
输出结果(下一行,拖动或ctrl+A)
■■■■■■■ 输出: 1 ■■■■■■■
解析:
昨天去面试,就掉到上浮的坑里,本来是知道这个问题的,但是不太熟练又被迷惑。
最后面试官给我说,变量上浮,是在定义的时候产生的,执行时不存在这个问题。
来看这个题,a()函数 可以重新这样写
function a(){ function b()//上浮 { function a(){};//上浮至最高,变量a是函数 a=10;//变量a又被赋值为10 return; } var a;
a=1;
b();//执行b(),因为b上浮到顶部,所以先执行了b()中的a=10,然后才执行了上一行的a=1,所以最终结果是1 log(a); } a();
_______________________________________________________
(分割线,在这个题的基础上修改一下)
function test() { //a() return console.log(a,b); function a(){console.log(test)} var b = 'ssss'; } test();
这个里面函数a()和变量b的定义都是在return之后,输出结果是什么?
如果把a()的注释去掉,会得到什么?
输出结果: function a()内容和undefined
这说明,在函数执行前(或者说函数执行时),function a()形式的声明,可以提升至作用域顶部,而var就不具备这个作用。
如果把注释去掉,执行a(),则会报错test未定义,说明函数只有在执行时才会检查调用的变量是否存在,可以推想,未执行的函数内部如果有错误也是不会报错的,请看下面这个代码:
function b(){ asdfasdfasdf as dfa sdf asdfasdfasdffas dfa }
不执行b(),是不会出现任何错误的。
再看一段代码:
function a() { var a = 1; function b() { console.log(a); a = 10; console.log(a); return; function a() {a=5;} } b(); console.log(a); } a();
输出:
function a()
10
1
这是因为return后面的function a()提升至顶部,并在当前函数作用域内声明了一个本地局域变量a,a=10赋值给该局域变量。
如果把return后面的function a()注释掉,则输出
1
10
10
这两种输出说明,function a()具有和var a同样的作用,指定了a的作用域为函数体内。修改一下,比如:
function a() { var a = 1; function b() { console.log(a) var a = 10; console.log(a) return; } b(); console.log(a); } a();
这里b()函数体内的var a=10将变量a的作用域设定在函数体内,a=10的赋值就会在b函数内执行,而不会达到外部的a()函数。等价于:
function a() { var a = 1; function b() { var a; console.log(a) a = 10; console.log(a) return; } b(); console.log(a); } a();
好了,看明白上面的内容,再来看餐后甜点:
var foo = 1; function Main(){ console.log(foo); var foo = 2; console.log(this.foo); this.foo = 1; } Main(); new Main();
输出有什么不同?

浙公网安备 33010602011771号