美文网首页
浅谈闭包篇

浅谈闭包篇

作者: 朝槿123 | 来源:发表于2017-06-30 20:55 被阅读0次

一、什么是闭包?##

简言之,闭包是由函数引用其周边状态(词法环境)绑在一起形成的(封装)组合结构。在 JavaScript 中,闭包在每个函数被创建时形成。

这是基本原理,但为什么我们关心这些?实际上,由于闭包与它的词法环境绑在一起,因此闭包让我们能够从一个函数内部访问其外部函数的作用域。

闭包的形成需要两个条件:

  • 在函数内部创建新的函数;
  • 新的函数在执行时,访问了函数的变量对象;

要使用闭包,只需要简单地将一个函数定义在另一个函数内部,并将它暴露出来。要暴露一个函数,可以将它返回或者传给其他函数。

内部函数将能够访问到外部函数作用域中的变量,即使外部函数已经执行完毕。

根据以上的摸索情况,再次总结一下闭包:

  • 闭包是在函数被调用执行的时候才被确认创建的。
  • 闭包的形成,与作用域链的访问顺序有直接关系。
  • 只有内部函数访问了上层作用域链中的变量对象时,才会形成闭包,因此,我们可以利用闭包来访问函数内部的变量。

闭包使用的例子####

闭包的用途之一是实现对象的私有数据。数据私有是让我们能够面向接口编程而不是面向实现编程的基础。而面向接口编程是一个重要的概念,有助于我们创建更加健壮的软件,因为实现细节比接口约定相对来说更加容易被改变。
“面向接口编程,别面向实现编程。” 设计模式:可复用面向对象软件的要素

在 JavaScript 中,闭包是用来实现数据私有的原生机制。当你使用闭包来实现数据私有时,被封装的变量只能在闭包容器函数作用域中使用。你无法绕过对象被授权的方法在外部访问这些数据。在 JavaScript 中,任何定义在闭包作用域下的公开方法才可以访问这些数据。例如:

Paste_Image.png
在上面的例子里,get() 方法定义在 getSecret() 作用域下,这让它可以访问任何 getSecret() 中的变量,于是它就是一个被授权的方法。在这个例子里,它可以访问参数 secret。

对象不是唯一的产生私有数据的方式。闭包还可以被用来创建有状态的函数,这些函数的执行过程可能由它们自身的内部状态所决定。
在函数式编程中,闭包经常用于偏函数应用和柯里化。为了说明这个,我们先定义一些概念:

函数应用:一个过程,指将参数传给一个函数,并获得它的返回值。

偏函数应用:一个过程,它传给某个函数其中一部分参数,然后返回一个新的函数,该函数等待接受后续参数。换句话说,偏函数应用是一个函数,它接受另一个函数为参数,这个作为参数的函数本身接受多个参数,它返回一个函数,这个函数与它的参数函数相比,接受更少的参数。偏函数应用提前赋予一部分参数,而返回的函数则等待调用时传入剩余的参数。偏函数应用通过闭包作用域来提前赋予参数。

** 题1**

function fun(n,o) {
   alert(o)
   return {
     fun:function(m){
        return fun(m,n);
     }
  };
}
var a = fun(0);  a.fun(1);  a.fun(2);  a.fun(3);     //undefined,0,0,0   
var b = fun(0).fun(1).fun(2).fun(3);                 //undefined,0,1,1
var c = fun(0).fun(1);  c.fun(2);  c.fun(3);         //undefined,0,1,1

题2

 var name = "The Window";
 var object = {
     name : "My Object",
     getNameFunc : function(){
        return function(){
               return this.name;
          };
      }
  };
  alert(object.getNameFunc()());    //The Window

题3

   var name = "The Window";
   var object = {
      name : "My Object",
      getNameFunc : function(){
        var that = this;
        return function(){
            return that.name;
            };
       }
  };
  alert(object.getNameFunc()());//My Object

相关文章

  • 浅谈闭包篇

    一、什么是闭包?## 简言之,闭包是由函数引用其周边状态(词法环境)绑在一起形成的(封装)组合结构。在 JavaS...

  • 浅谈闭包

    闭包是函数式语言里面很重要的部分,但是网上很多文章却只讲闭包的应用,而鲜有谈及其本质。 理解闭包的关键在于,知道它...

  • 浅谈闭包

    简要来讲,闭包就是一个函数引用另外一个函数的变量,因为变量被引用着所以不会被回收,因此可以用来封装一个私有变量。 ...

  • 浅谈闭包

    前端开发者经常在面试时会碰到这样一道题:什么是闭包?首先我们来谈谈闭包的定义:函数A有内置函数B,当内置函数B调用...

  • 浅谈闭包

    js中的闭包 闭包是学习js中永远也绕不过去的一个坎,那么,今天我们就去一段简单的代码开始聊一聊闭包 什么是闭包 ...

  • 浅谈闭包

    《你不知道的JavaScript》这样描述: 当函数可以记住并访问所在的词法作用域时,就产生了闭包, 即使函数是在...

  • 浅谈闭包

    闭包是JavaScript的重点也是难点之一,由于涉及多重知识点,对初学者来说比较难理解。本文将闭包相关的知识点进...

  • 浅谈闭包

    注: 文章摘自 Reng の Blog 定义 闭包是指有权访问另一个函数作用域中的变量的函数 我的理解是,函数内的...

  • 闭包

    浅谈 python 的闭包思想 首先 python的闭包使用方法是:在方法A内添加方法B,然后return 方法B...

  • swift闭包

    浅谈闭包 闭包就是一段代码块,可以在任何地方调用。和函数类似,有参数和返回值。 来看一个简单的例子 带有参数的闭包...

网友评论

      本文标题:浅谈闭包篇

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