for中let 和var区别,闭包详解

for 循环中var

 for(var i=1;i<=3;i++){
         console.log(i)
              //输出 1,2,3
       }

复制代码

由于我们是用的var是全局变量所以,window.i可以查看到i的值,这时候我们发现i=4;这是为什么呢?
因为i是全局变量,所以我们在i++的时候一直操作的是全局i,当我们的i等于3的时候,在进行下一次计算i++的时候,i由于等于4不执行下面花括号,console.log(i),但是我们这里已经把i++了所以导致i等于4了

for 循环中let

for(let i=1;i<=3;i++){
        console.log(i)
             //输出 1,2,3
      }
//由于我们是let块级作用域,所以在window.i是空
复制代码

我们在看一个例子var

  for(var i=1;i<=3;i++){
          setTimeout(function(){
           console.log(i)
          },1000)
      }
     //这时候我们会发现,输出3个4
     我们for循环执行完了之后,setTimeout会去找这个I,因为,这里I是全局I,用的是同一个作用域
     所以我们能看到34复制代码

我们在来看let

  for(let i=1;i<=3;i++){
          setTimeout(function(){
           console.log(i)
          },1000)
      }
     //这时候我们会发现,输出1,2,3
         为什么跟上面不一样呢?由于我们是声明的let 有块级作用域,
         第一个内存空间是 i=1  setTimeout函数也会在里面,所以我们有3个块级作用域
         第一个内存空间是 i=2  setTimeout函数执行的时候返回找i发现i=2
         第一个内存空间是 i=3  setTimeout函数执行的时候返回找i发现i=2
复制代码

我们在来说下闭包

先看下面这个例子

  function user (){
         let i=1;
         function show(){
             console.log(++i)
         }
         show();
     }
     user();//输出2
     user();//输出2
     user();使用的时候,会开辟一个新的内存空间,然后使用函数user,所以i始终都被let声明i=1;
     所以我们无论调用几次 user(); 这里输出都是2,并不会调用一直累加输出例如2,3,4,5这样;
     因为每次使用都会声明一个新的内存空间
复制代码

使用闭包

我们在来看下下面

     function user (){
        let i=1;
       return   function (){
            console.log(++i)
        }
    }
  let a=  user();
  a();//输出2
  a();//输出3
  a();//输出4
  那为什么会出现这种情况呢,其实是这样的,在user里面我们return返回了一个函数
  由于我们把user();指向了a,这里我们会开辟一个内存空间,会把 i 和 return 函数都指向了这个内存空间
  由于我们指向了a,所以内存并不会被销毁,所以我们每次调用a()的时候都会指向原来开辟的那个空间,
  所以会出现输出2,3,4这种情况
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享