JavaScript[15] -- 作用域

全局作用域

  1. 在<script></script>标签里,即为全局作用域
  2. 在函数体以外,<script>标签内声明的变量就是全局变量
  3. 全局作用域内的变量能够在任何其他的作用域接见和修正。

    <script>
        vara = 0;
        function func1(){
            a = 1;
            console.log(a);     
            console.log(b);     
        };
        func1();     // 1  b is not defined
    </script>
    
    <script>
        varb = 2;        
        func1();    // 1 2
    </script>
    

部分作用域

  1. 一个函数体就是一个新的部分作用域。
  2. 函数内部定义的变量在部分作用域内。
  3. 函数外部作用域不能接见内部作用域的变量。
  4. 每一个函数有差别的作用域,在其他函数中是不能够接见的(一个函数接见另一个函数变量的时刻,经由过程通报参数)。

    <script>       
        function func1(){
            var a = 0;  
        };
    
        function func2(){
            var b = 2;             
            console.log(b);
            console.log(a);
        };
    
        func2();    // 2   a is not defined
    
        console.log(b); // b is not defined 
    </script>     
    

作用域链

  1. 函数作用域内里接见一个变量,先从本身最先找,假如没有,就顺次往上一级作用域查找,直到全局作用域,全局作用没有就报错。
  2. 当我们处于某一个作用域内里,修正某个变量值的时,先修正本身作用域,假如没有就顺次修正上一个作用域。

       
    <script>       
        var a = 10;
        var b = 30;
        function func(){
            var a = 20; // 声明部分变量a
            a = 2;      // 转变部分变量a
            b = 3;      // 本作用域中无b变量,会顺次变动上层作用域中的变量
            c = 4;      // 给未被声明的变量赋值,会泄漏带window中
            d = 5;      // (未报错?)本作用域中无d变量,会顺次变动上层作用域中的变量,悉数没有则报错
            console.log(a);
        };
    
        console.log(b);     // 30       全局变量b
        // console.log(c);     //         c is not defined
        func();             // 2        部分变量a
        console.log(a);     // 10       全局变量a
        console.log(b);     // 3        被基层作用域修正的变量b
        console.log(c);     // 4        被泄漏到window中的变量c
    </script>
    

delete

  1. 删除未声明的变量,然则不能够删除已声明的变量

    <script>       
        var a = 10;
        b = 30;
       
        delete a;
        delete b;
    
        console.log(a);     // 10
        console.log(b);     // b is not defined
    </script>
    

块作用域(ES6新增)

  1. let , const 不仅仅是声明变量的区分,它们另有支撑块作用域的机制(注重:不是大括号,if,switch,for发生的块)
  2. let,consts声明的变量不会泄漏到顶层对象,只能声明以后再运用,var能够先赋值,在声明

    <script>
        if(true){
            var a = 10;
            let b = 20;
            const c = 30;
        };
    
        console.log(a);     // 10
        console.log(b);     // b is not defined
        console.log(c);     // b is not defined
    </script>
    

注重

  • 多个作用域题目

    <div>1</div>
    <div>2</div>
    <div>3</div>
    <div>4</div>
    <div>5</div>
    
    <script>
    
        var aDiv = document.getElementsByTagName("div");
    
        for(var i = 0; i < 5; i++){  
    
            aDiv[i].index = i;      // 处理i运用var声明时,在函数作用域中的变量i一向是末了实行效果的题目
    
            aDiv[i].onclick = function(){     
    
                console.log(i);             // i运用var声明,效果一向都是5, i运用let声明,效果是0 1 2 3 4 
                                           // 函数体和for轮回不处于同一个作用域,需等前一个作用域实行完,才会实行本作用域
                console.log(this.index);    // 0 1 2 3 4 
            }
        }
    
    </script>
    
    原文作者:豆爹
    原文地址: https://segmentfault.com/a/1190000016114690
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞