1 | var a = 1; |
答案: undefined -> 2 -> 3 -> 1 -> 4 -> 1
解析:
1)在立即执行函数中,var a = 4;
语句定义了一个局部变量,由于函数作用域的特性,将函数的变量声明“提前”,同时变量初始化留在原来的位置(局部变量在整个函数体始终是有定义的,函数体内局部变量遮盖了全局变量,只有在程序执行到var语句或赋值语句的时候,局部变量才会真正的被赋值)。因此,第一条console.log(a)
输出是undefined
,第三条console.log(a)
输出是3
,第五条console.log(a)
输出是4
;
2)当访问一个变量时,解释器会首先在当前作用域查找标示符,如果没有找到,就去父作用域找,直到找到该变量的标示符或者不在父作用域中,这就是作用域链。在当前函数作用域中,没有找到b
的声明,就去上一级(也就是全局作用域)中找到了var b = 2;
,故第二条console.log(b)
输出是2
,第六条console.log(a)
输出是1
。
欣赏此文,打赏一下