闭包混杂

1.什么是闭包

广义的说,一个变量一个函数就形成了一个闭包,典型的说:一个父函数,返回一个子函数,子函数调用父元素的局部变量,所以父函数的内存不能够释放,所以可以拓展了作用域。
借用于阮一峰老师的话:闭包就是能够读取其他函数内部变量的函数 链接地址
芳姐的闭包理解「函数」和「函数内部能访问到的变量」(也叫环境)的总和,就是一个闭包。链接地址

简单的闭包
简单的闭包

2.经典的闭包解析

var fn = function (){
      var local = "hello"
      function say(){
          return local
      }
      return say
}

解析

  1. 有时候看到在闭包中有立即执行函数,但是这个不是必须的,2个不同的概念不好弄混
为了省略一个变量的申明,我可以用一个立即执行函数  
(function(){
     var local ='hello';
      function say(){
            return local
      }
      return say
})()
  1. 为什么要return一个函数呢?
    如果不返回return,我们怎么访问这个变量,闭包的作用就是隐藏变量的同时,又可以访问到这个变量,如果不return,我们可以用window来得到
(function(){
     var local ='hello';
      window.say = function (){
             local= local  +  'world'
             return local;
      }
})()
这样也是一个闭包,一个函数访问了其他函数的局部变量。

3. 闭包的经典运用

  1. 修改代码让fnArri 输出 i
  var fnArr = [];
    for (var i = 0; i < 10; i ++) {
        fnArr[i] =  function(){
            return i;
        };
    }
    console.log( fnArr[3]() ); 

主要是当我们在调用的时候,js加载完成,此时i存放在全局变量中,循环结束后的值是10,所以会一直输出10
方法一:立即执行函数和闭包

var fnArr = [];
for(var i =0;i<10;i++){
        fnArr[i]=(function (){
             var n =i 
             return function(){
                   return n;
              };
        })(i)
}

简化

var fnArr = [];
for(var i =0;i<10;i++){
        fnArr[i]=(function (n){
             return function(){
                   return n;
              };
        })(i)
}
var fnArr = [];
for(var i =0;i<10;i++){
        fnArr[i]=(function (){
            var n=i
             return function(){
                   return n;
              };
        })()   //这里不用传递参数
}

方法二: 闭包

var fnArr = [];
for(var i =0;i<10;i++){
 (function (){
        var n = i;
        fnArr[i]=function (){
                  return n
        }
})()
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 什么是闭包? 有什么作用闭包:函数对象可以通过作用域链相互关联,函数体内部的变量可以保存在函数的作用域内。 上述代...
    coolheadedY阅读 4,057评论 0 0
  • 问题 一、什么是闭包? 有什么作用? 闭包闭包就是能够读取其他函数内部变量的函数。在javascript中,只有函...
    婷楼沐熙阅读 3,698评论 0 0
  • 都25岁的人了,还是那么喜欢发神经。不知,这是为了什么?为了掩盖内心的孤独?总是喜欢给别人炫耀些什么,可自己...
    码农甲乙丙阅读 3,068评论 0 0
  • 数据类型: 一,原始类型: Number String Boolean null undefined二,引用类型 ...
    2点半阅读 3,751评论 0 3
  • 绝对没有一棵大树是树苗种下去,马上就变成大树,一定是岁月刻画着年轮,一圈圈往外长!每当遇到挫折和困难,让我们看看大...
    peter_621f阅读 1,163评论 0 0