【进阶】下面代码会输出什么

Posted by ARTROY on 2019-11-01
1
2
3
4
5
6
7
8
9
10
11
12
var a = 1;
var b = 2;
(function () {
console.log(a); // 第一条
console.log(b); // 第二条
a = 3
console.log(a); // 第三条
console.log(window.a); // 第四条
var a = 4;
console.log(a); // 第五条
})()
console.log(a); // 第六条

答案: 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



支付宝打赏 微信打赏

欣赏此文,打赏一下



-->