js预解析的题

126 阅读1分钟

今天分享一道关于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>

这里先把打印的结果看一下

image.png

结果是先打印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是局部变量,在外面访问不到,所以会报错。