在for循环里用var实现let的效果

用for循环连续按顺序打印1,2,3,4,5(间隔1秒);
于是噼里啪啦写出以下代码:

for(var i =1;i<=5;i++){
    setTimeout(() => {
        console.log(i);
    }, i*1000);
}

于是,一运行,不到啊,怎么都是打印6(涉及到事件循环)。
然后你仔细看了以下代码,哦,把Var改成let不就可以了。
运行了一下,确实可以。
这时候面试官又来了一个问题,请换种方式实现。。
What??
利用闭包
for(var i = 1;i<=5;i++){
(function(i){
setTimeout(function(){
console.log(i);
},i*1000)

})(i)

}

顺便说一下闭包,
其实到目前,我对闭包的理解依旧感觉很浅。
闭包的存在,是因为作用域链,即里层的作用域可以访问外层的作用,反过来则不行。
所以在我看来,闭包就是 为了外层作用域可以访问里层的变量,通过一个函数的返回值将其结果返回出去。

 function f1(){
     var a = 1;
     function f11(){
         return a
     }
     return f11
 }
 const resultf1 = f1()
console.log(resultf1());

这样解决可以拿到a的值了。
如果直接访问是拿不到的。
注意:如果没有用var,let,const声明的话,会直接变成全局变量。

var name = "The Window";

  var object = {
    name : "My Object",

    getNameFunc : function(){
      return function(){
        return this.name;
      };

    }

  };

  alert(object.getNameFunc()());

猜一猜输出什么?
object.getNameFunc()返回的是一个函数
变成function(){
        return this.name;
      };
此时已经在全局环境下了,所以this.name是window
如果这样呢?

 var name = "The Window";

  var object = {
    name : "My Object",

    getNameFunc : function(){
      var that = this;
      return function(){
        return that.name;
      };

    }

  };

  alert(object.getNameFunc()());
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值