美文网首页
闭包混杂

闭包混杂

作者: sunny519111 | 来源:发表于2017-01-19 14:40 被阅读12次

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
        }
})()
}

相关文章

  • 闭包混杂

    1.什么是闭包 广义的说,一个变量一个函数就形成了一个闭包,典型的说:一个父函数,返回一个子函数,子函数调用父元素...

  • swift-闭包

    闭包 闭包定义 闭包简化 - 尾随闭包 闭包参数 闭包返回值 闭包的循环引用

  • 闭包,闭包,闭包

    1、这家伙到底是什么? 网上关于这个的讨论的太多了太多了,有各种的举例子,但是大部分还在寻找这个答案的小伙伴对于变...

  • 闭包-Closures [swift 5.1]

    闭包的语法 尾随闭包 闭包逃离 自动闭包

  • Day7 闭包(Closures)

    本页包含内容:• 闭包表达式• 尾随闭包• 值捕获• 闭包是引用类型• 逃逸闭包• 自动闭包 1、闭包表达式 闭包...

  • Python闭包

    闭包 = 环境变量 + 函数 调用闭包内部的环境变量 闭包的经典误区 闭包与非闭包实现人类走路 非闭包 闭包

  • 闭包(closure)

    ● 闭包基础 ● 闭包作用 ● 闭包经典例子 ● 闭包应用 ● 闭包缺点 ● 参考资料 1、闭包基础 作用域和作...

  • swift- 闭包一

    /*• 闭包表达式• 尾随闭包• 值捕获• 闭包是引用类型• 逃逸闭包• 自动闭包*/

  • (9) python之闭包

    闭包闭包 = 函数 + 环境变量(函数定义的时候) 一个最简单的闭包 闭包不受外部变量影响 非闭包 闭包 闭包 只...

  • js 混杂点-变量声明,提升与闭包

    一 变量声明 js定义变量大家都知道是用var,这个var如果在全局,他可有可无,但是如果在函数内部那么就有点不一...

网友评论

      本文标题:闭包混杂

      本文链接:https://www.haomeiwen.com/subject/eckibttx.html