学习笔记-JS作用域与预解析

127 阅读1分钟

作用域

1、全局作用域

在任何地方都可以访问到的是全局作用域。

2、局部作用域

只在固定的代码片段内可访问到的变量,例如函数内部。

3、块级作用域(ES6新增)

在一对花括号{}中的包裹的代码。

预解析

  • JavaScript代码的执行是由浏览器中的JavaScript解析器来执行的。
  • JavaScript解析器执行JavaScript代码的时候,分为预解析和代码执行。

预解析过程

1、var变量预解析:把变量的声明提升到当前作用域的最前面,只会提升声明,不会提升赋值。

//代码示例
<script>
    console.log(num); // undefined
    var num = 123;
</script>

//预解析过程
<script>
    // 把变量的声明提升到当前作用域的最前面
    var num;
    console.log(num);
    num = 123;
</script>

2、函数预解析:把函数的声明提升到当前作用域的最前面,只会提升声明,不会提升调用。

//代码示例
<script>
    test();
    alert(test);
    function test() {
        console.log("hello world");
    }
</script>

//预解析过程
<script>
    // 把函数的声明提升到当前作用域的最前面
    function test() {
        console.log("hello world");
    }
    test();
    alert(test);
</script>

3、先提升var,再提升function。

//代码示例
<script>
    var a = 666;
    test();
    function test() {
        var b = 777;
        console.log(a);
        console.log(b);
        var a = 888;
    }
</script>

//预解析过程
<script>
    var a;
    function test() {
        var b;
        var a;
        b=777
        console.log(a); //undefined
        console.log(b);//777
        a = 888;
    }
    a = 666;
    test();
    
</script>

注意点

变量和函数同名时, 函数提升的优先级高于变量。

<script>
    console.log(num);
    function num() {
        console.log("hello world");
    }
    var num = 666;
    console.log(num);

    /*预解析
    function num() {
        console.log("hello world");
    }
    var num;
    console.log(num);
     /*ƒ num() {
        console.log("hello world");
    	}*/
    num = 666;
    console.log(num);//666
     */
</script>