几道题目理解JavaScript作用域、作用域链、预解析规则、表达式

541 阅读1分钟

先看题目

1、结果是 undefined

    console.log(a)
    var a = 1

2、报错 Uncaught ReferenceError: Cannot access 'a' before initialization

    console.log(a)
    let a = 1

3、报错 Uncaught ReferenceError: a is not defined

    console.log(a)
    a = 1

4、结果 ƒ a() {a=4}、 1 、1、 3、 3

    console.log(a)
    var a = 1
    console.log(a)
    function a() {a=2}
    console.log(a)
    var a = 3
    console.log(a)
    function a() {a=4}
    console.log(a)

5、结果 ƒ a() {console.log(a=4)} 、 1 、1 、3 、3、 Uncaught TypeError: a is not a function

    console.log(a)
    var a = 1
    console.log(a)
    function a() {a=2}
    console.log(a)
    var a = 3
    console.log(a)
    function a() {console.log(a=4)}
    console.log(a)
    a()

6、1

<script>
    var a = 1
</script>
<script>
    console.log(a)
</script>

7、Uncaught ReferenceError: a is not defined

   <script>
        console.log(a)
    </script>
    <script>
        var a = 1
    </script>

8、undefined、 1

   var a = 1
    function f() {
        console.log(a)
        var a = 2
    }
    f()
    console.log(a)

9、1、 2

    var a = 1
    function f() {
        console.log(a)
        a = 2
    }
    f()
    console.log(a)

10、undefined、1

    var a = 1
    function f(a) {
        console.log(a)
        a = 2
    }
    f()
    console.log(a)

11、1、1

    var a = 1
    function f(a) {
        console.log(a)
        a = 2
    }
    f(a)
    console.log(a)

浏览器解析过程

1、预解析

找 var function 参数,变量赋予undefined,function为整个函数块 script自上而下 函数由里到外

2、逐行解读代码

表达式(+ - * / % ++ -- ! 参数)可以修改预解析出来的值,函数声明不是表达式,函数调用也是局部的域