当前位置:网站首页>let 块级作用域

let 块级作用域

2022-08-11 05:17:00 -加油

1、var 和 let 函数作用域

            function fun(){
    
                let a = 10;
                console.log(a);// 输出10
            }
            fun();// 函数执行结束后会被js回收机制回收
            console.log(a);//报错 

函数执行结束后变量会被js回收机制回收
报错

              function fun(){
    
                  var a = 10;
                  console.log(a);
              }
              fun();// 函数执行结束后会被js回收机制回收
              console.log(a);//出错

2、同一作用域不可重复声明

            function fun(a){
    
                // let a = 10 这里会报错 在同一作用域下不可重复声明
                console.log(a);
            } 
            fun(1)

不在同一作用域:

            function fun(a){
    
                {
    
                    let a = 10; // 块级作用域
                    console.log(a);// 先输出10 
                }
                console.log(a);//再输出 1 
            }
            fun(1)

3、if{}块作用域

             if(1){
    
              let a = 3;
                {
    
                  let a = 10;
                  console.log(a);//10 它的块级作用域1
                }
                console.log(a);//3 它的块级作用域
             }
             console.log(a); // 报错

4、for的
在for(; ; ) {}循环中 (; ;)为父作用域,{}为子作用域

    //父作用域的i
    for(let i = 0;i<3;i++){
    
        //这两个i分别是父作用域、子作用域的i
        //没有重复声明
         let i ='ES6';//子作用域的i
        console.log(i);//会输出3个ES6
    }

而使用var时:

    //使用var,把i提升到全局变量
    for(var i = 0;i<3;i++){
    
         var i ='ES6';// 把循环的i覆盖了 
         //所以下次循环不满足i<3 
        console.log(i);//会输出1个ES6
    }

使用let但没有赋值时:

    for(let i = 0;i<3;i++){
    
        let i ;// 子重新定义了 但没有赋值
        console.log(i);//三次undefined
    }

没有在子作用域定义时:
使用父作用域的:

    for(let i = 0;i<3;i++){
    
        //子作用域没有i可以使用父作用域的i
        console.log(i);//会输出0 1 2
    }

修改父作用域的:

    for(let i = 0;i<3;i++){
    
        //在子中 没有定义i 所以还是使用了父的i
        //把 父的i的值修改了 
         i ='ES6';// 所以第二次循环时满足不了i<3
        console.log(i);//会输出一个ES6
    }

重复定义:

    for(let i = 0;i<3;i++){
    
        //在子中定义 var i ,var 会提升
      // 这样就与父的let i冲突,造成for(let i)时的重复定义
         var i ='ES6'; 
        //Identifier 'i' has already been declared
        console.log(i);//报错
    }

5、
使用var:

        var fun = [];
        //var i 把i提升到全局上循环时用的都是同一个window.i 
        for(var i =0;i<3;i++){
    
        //该函数定义时并没有执行
            fun[i] = function(){
    
                //i 父作用域 由于是var 是全局作用域 随时被覆盖
                console.log(i);//当调用函数执行时 i已经被覆盖
            }
        }
        console.log(i);//3
        fun[0]();//3
        fun[1]();//3
        fun[2]();//3

       for(var i=0;i<3;i++){
     //for又把i覆盖了 所以调用函数时输出的i不一样了
           fun[i]();// 输出 0 1 2 
       }
      console.log(i);//3

使用let:

       var fun = [];
        for(let i =0;i<3;i++){
    
            fun[i] = function(){
    
                //i 使用的是父作用域的
                console.log(i);
            }
        }
        // console.log(i);//Error: i is not defined
        fun[0]();//0
        fun[1]();//1
        fun[2]();//2

        for(let i=0;i<3;i++){
    
         fun[i]();// 输出 0 1 2 
        }
        //console.log(i);//Error: i is not defined
       var fun = [];
        for(let i =0;i<3;i++){
    
            fun[i] = function(){
    
                //子作用域重新定义i 
                let i = '修改i'
                console.log(i);
            }
        }
        // console.log(i);//Error: i is not defined
        fun[0]();//修改i
        fun[1]();//修改i
        fun[2]();//修改i
原网站

版权声明
本文为[-加油]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_51040174/article/details/125265744