今天分享一道关于js预解析的题目,代码如下:
<script>
f1()
console.log(c)
console.log(b)
console.log(a)
function f1() {
var a = b = c = 9
console.log(a)
console.log(b)
console.log(c)
}
</script>
这里先把打印的结果看一下
结果是先打印f1函数里的a,b,c,再打印c,b,最后a是报错的情况。
因为js预编译的机制,其实际上运行的情况是这样的
function f1(){
var a;
a = b = c = 9;
console.log(a)// 9
console.log(b)// 9
console.log(c)// 9
}
f1()
console.log(c) //9
console.log(b) //9
console.log(a) //报错
1.这里首先函数会先进行函数声明提升,然后我们在上方调用,相当于先执行f1函数
2.最关键的是函数里的var a = b = c = 9,。其实执行的是var a,a=9,b=9,c=9.因为b和c是直接赋值,没有var声明,所有它俩相当于全局变量。而var a ;使得a是局部变量。
3.所以最后在全局打印a,b,c的时候,只有b,c可以打印出来,因为a是局部变量,在外面访问不到,所以会报错。