最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • for中let 和var区别,闭包详解

    正文概述 掘金(聂成勇同学)   2021-06-12   483

    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,用的是同一个作用域
         所以我们能看到3个4。
    

    我们在来看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这种情况
    

    起源地下载网 » for中let 和var区别,闭包详解

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元