javascript中闭包的一些明白

闭包是javascript中绕不开的话题,关于闭包的一些观点和运用,这方面材料比较多,在此就不再赘述。尽人皆知,闭包的一个作用就是 让一些变量一向保持在内存中 ,在此我用一些现实代码对这句话作进一步的邃晓。

demo1:
    function closure(){
      var n = 0;
      function test() {
        console.log(++n);
      }
      test() 
      test() 
    }
    closure(); //输出1,2(这个很好邃晓,不多说)
demo2:
    function test(){
        var i=0;
        return function(){
            console.log(i++);
        }
        }
        var fn = test();
        fn(); //输出0
        fn(); //输出1

上述代码中,fn就是实行函数test()返回的匿名函数。因为fn又是一个全局变量,生命周期一向存在,且这个匿名函数引用了父函数test内里的一个局部变量,所以变量i的状况会被一向保留.

demo3:
    function test(){
        var i=0;
        return function(){
            console.log(i++);
        }
    }
    test()(); //输出0
    test()(); //输出0

上述代码中,实行test()返回的是其内部的匿名函数,然则实行完test()()今后,该匿名函数的生命周期已完毕,所以变量i的状况没有获得保留。

最近在简书上读到一篇风趣的文章,个中一些代码以下:

for (var i = 0; i < 5; i++) {
 setTimeout((function(i) {
    console.log(i);
  })(i), i * 1000);
}   //输出0,1,2,3,4

上述代码中有一个setTimeout()函数,其运用花样为setTimeout(func,time),意义是最少过time时刻后,实行func。有了如许的熟悉后,我们能够把func等价成:
(function(i){console.log(i)})(i)这个自实行函数。所以这个事情份两步,起首每次轮回自实行函数肯定会马上实行一次,会顺次输出1,2,3,4。其次,每过time时刻,实行一次func,然则在上述代码中,func等价于一个马上实行函数,没有返回值,故什么也不会做。
如果把上述代码改成如许:

for (var i = 0; i < 5; i++) {
  var j=7;
  setTimeout((function(i) {
    console.log(i);
    return function(){
       console.info(j++);
    }
  })(i), i * 1000);
}

上述代码会顺次输出0,1,2,3,4, 7,8,9,10,11(连系这个例子邃晓上一个题目,就轻易多了)

如果把上面的代码改成如许呢?

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

运转上面的代码会输出5个5(这一点如今能够邃晓了吧),有人不解的是为何是每隔一秒输出5而不是隔五秒输出5。setTimeout(func,time)这个函数耽误实行的只是func内里的行动,而time的值是不存在耽误的。上面实行for轮回,相当于:setTimeout(func,1000),setTimeout(func,2000) …. 第一次setTimeout实行的时刻等了一秒(正确地说,最少要等一秒),第二次setTimeout实行的时刻等2秒,然则前面第一次实行的setTimeout函数时,已等了一秒,所以只需再等一秒就能够马上实行了。在这里,须要弄邃晓的是,setTimeout函数耽误实行的时刻,出发点是从time最先赋值的时刻盘算的,不是从上一个setTimeout函数实行完最先算的。

    原文作者:唐僧洗头爱飘柔
    原文地址: https://segmentfault.com/a/1190000008571702
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞