zoukankan      html  css  js  c++  java
  • 关于闭包与for循环的理解

     function createFunction1(){
                for(var i=0;i<5;i++){
                  function s(){
                    console.log(i);
                  }
                  s();
                }
              }
              createFunction1();   //0 1 2 3 4;

    以上是一个正常的函数。

      function createFunction2(){
                for(var i=0;i<5;i++){
                  setTimeout(function timer(){
                    console.log(i);
                  },i*1000);
                }
              }
              createFunction2();  //每隔1秒输出‘4’、共输出5次

    并不会按照我们预想的每隔1秒分别输出0、1、2、3、4

    分析一下原因:

    此函数在for循环的第一层是setTimeout函数,他的执行和createFunction1中的s函数一样,将按分别在1秒后、2秒后、3秒后执行。但这儿需要注意的是,setTimeout的内部函数timer并没有立即执行,for循环中的i将会把值分别赋给setTimeout外部参数中的i,但其内部函数timer()则只会引用包含函数setTimeout()中的变量的最后一个值。因为闭包所保存的是整个变量对象,而不是某个特殊的变量。当然其中的这些处理变化,都是瞬间完成的,与执行时间并无关系,即使把1000改成0效果还是一样的。

    重写一下这个函数:

     function createFunction3(){
                for (var i=0;i<5;i++){
                  (function(j){
                       setTimeout(function timer(){
                       console.log(j);
                      },i*1000);
                  })(i);
                }
              }
              createFunction3();   //每隔1秒分别输出0 1 2 3 4

    再看上面这个例子,给外部包装了一个立即执行的匿名函数,setTimeout里面的匿名函数不再引用外部函数的参数,而是直接引用外部匿名函数的参数,这时,一切就会按照我们预想的来执行了。

  • 相关阅读:
    MS SQL 错误 :17883,严重度: 1,状态: 0
    秒杀架构中高性能可扩展高可用的一点思考
    让IE10等支持classList2.0
    判定元素是否刚插入到DOM树
    accept巨坑
    for in 循环的输出顺序问题
    css斜线
    angular的directive笔记
    avalon最佳实践
    迷你MVVM框架 avalonjs 0.97发布
  • 原文地址:https://www.cnblogs.com/qqqiangqiang/p/5171248.html
Copyright © 2011-2022 走看看