`
holdbelief
  • 浏览: 707546 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

闭 包

阅读更多

闭包

我没有自觉地学习过JavaScript。我必须快点了解它,因为我发现如果没有它,在实际工作中编写AJAX应用程序的准备就不会充分。开始,我感到我的编程水平好像降了几个级别。(JavaScript!我的C++朋友会怎么说?)但一旦我克服最初的障碍,我就发现JavaScript实际上是功能强大、表现力极强而且非常简练的语言。它甚至具有其它更流行的语言才刚刚开始支持的功能。

 

JavaScript的更高级功能之一是它支持闭包,这是C#2.0通过它的匿名方法支的功能。闭包是当内部函数(或C#中的内部匿名方法)绑定到它们外部函数的本地变量时所发生的运行时现象。很明显,除非此内部函数以某种方式被外部函数访问,否则它没有多少意义。实例可以更好说明这一点。

 

假设需要根据一个简单条件一个数字序列,这个条件是:只有大于100的数字才能通过筛选,并忽略其余数字。为此,可以编写类似图8中的函数。

Figure 8 根据谓词筛选元素

<script>
function filter(pred, arr) 
{
    var len = arr.length;
    var filtered = []; // shorter version of new Array();
    // iterate through every element in the array...
    for(var i = 0; i < len; i++) 
    {
        var val = arr[i];
        // if the element satisfies the predicate let it through
        if(pred(val)) 
        {
            filtered.push(val);
        }
    }
    return filtered;
}

var someRandomNumbers = [12, 32, 1, 3, 2, 2, 234, 236, 632,7, 8];
var numbersGreaterThan100 = filter
(
    function(x) 
    { 
          return (x > 100) ? true : false; 
    }, 
    someRandomNumbers
);
// displays 234, 236, 632
alert(numbersGreaterThan100);
</script>

 

但是,现在要创建不同的筛选条件,假设这次只有大于300的数字才能通过筛选,则可以编写下面这样的函数:

var greaterThan300 = filter
(
    function(x) 
    { 
         return (x > 300) ? true : false; 
    }, 
    someRandomNumbers
);

 然后,也许需要筛选大于50、25、10、600 如此等等的数字,但作为一个聪明人,您会发现它们全部都有相同的谓词"greater than",只有数字不同。因此,可以用类似下面的函数分开各个数字:

function makeGreaterThanPredicate(lowerBound) 
{
    return function(numberToCheck) 
    {
        return (numberToCheck > lowerBound) ? true : false;
    };
}

 这样,您就可以编写以下代码:

var greaterThan10 = makeGreaterThanPredicate(10);
var greaterThan100 = makeGreaterThanPredicate(100);
alert(filter(greaterThan10, someRandomNumbers));
alert(filter(greaterThan100, someRandomNumbers));

 通过观察函数makeGreaterThanPredicate返回的内部匿名函数,可以发现,该匿名内部函数使用lowerBound,后者是传递给makeGreaterThanPredicate的参数。按照作用域的一般规则,当makeGreaterThanPredicate退出时,lowerBound超出了作用域!但在这里,内部匿名函数仍然携带lowerBound,甚至在makeGreaterThanPredicate退出之后的很长时间内仍然如此。这就是我们所说的闭包;因为内部函数关闭定义它的环境(即外部函数的参数和本地变量)。

  开始可能感觉不到闭包的功能很强大。但如果应用恰当,它们就可以非常有创造性地帮您将想法转换成代码,这个过程非常有趣。在JavaScript中,闭包最有趣的用途之一是模拟类的私有变量。

下一节:模拟私有属性

分享到:
评论

相关推荐

    rustprimer-v1.13-大家新年快乐.pdf

    闭 包 闭 包 的 语 法 闭 包 的 实 现 闭 包 作 为 参 数 和 返 回 值 集 合 类 型 C o lle c t io n s 动 态 数 组 Ve c 哈 希 表 Ha s h M a p 迭 代 器迭代 器 、 适 配 器 、 消 费 者 模 块 和 包 系 统 、 P r...

    数据库2021第4次作业1

    A的闭包包含ACDE,B的闭包包含ABCDE,C的闭包包含ACDE,DE的闭包包含ACDE,CE的闭包包含ACDE,因此所有候选键是ACE、BDE。对于ρ={AD, AB, BC, CDE, AE},我们检查每一个分解,确保它们满足无损连接性。最后,为了将...

    LR 0 项 目 集 规 范 族 的 一 种 简易构 造 算 法

    闭 包 Α 转 换函 数 Β 8 中圈 分 类 号 ? Χ Δ &gt; ? 文 献 标 识 码 ? Ε 文 章 编 号 ? 一 ? ? · ? &gt; Φ ; ! ? ? 一 &lt; ? 一 ? ? ? · ? !"&gt;摘 共 ? 讨 论 了 计 算 机编译 系 统 中 9 : ; ? &lt; 项 目...

    spring-cloud-starter-netflix-zuul.zip已经闭源的jar包,pom

    《Spring Cloud Netflix Zuul:一个已经闭源的API网关组件》 在现代微服务架构中,API网关起着至关重要的角色,它作为一个统一的入口,负责路由、安全、监控等多种职责。Spring Cloud Netflix Zuul就是这样一款组件...

    图像的开运算和闭运算_闭运算_开运算_

    在图像处理领域,开运算和闭运算是一种非常重要的形态学操作,它们主要用于图像的形态学细化、噪声消除以及边缘检测等任务。这两种操作基于数学形态学理论,是图像处理中的基本工具,尤其在处理二值图像时效果显著。...

    什么是开闭原则,java开闭原则

    开闭原则是面向对象设计的核心原则之一,它的全称是"对扩展开放,对修改关闭",即在软件设计过程中,我们希望系统能够容易地添加新功能,同时保持原有代码的稳定性,避免频繁修改。这一原则由 Bertrand Meyer 在他的...

    J2EE项目更新补丁包打包工具

    描述中提到的“原创作品”意味着这是一个由个人或团队独立开发的软件,可能是开源的或者闭源的,具有一定的原创性和独特性。开发者因为拥有较多的资源,可能希望分享或出售这个工具来获得更多的积分或回馈,以支持其...

    fenshuiling.rar_图像定位_开闭运算_开闭重建运算_虹膜分割_虹膜定位

    在图像处理领域,"fenshuiling.rar" 文件包涵盖了几个关键知识点,主要涉及虹膜识别技术中的图像定位、开闭运算、开闭重建运算以及虹膜分割与定位。下面将详细阐述这些概念及其在实际应用中的作用。 首先,图像定位...

    贪心算法区间包含

    已知 n 个左闭右开区间 [ a , b) ,对其进行 m 次询问,求区间 [ l , r ] 最多可以包含 n 个区间中的多少个区间,并且被包含的所有区间都不相交。 用于贪心算法对区间包含问题的解决

    闭欧拉迹实验

    闭欧拉迹实验是组合数学领域的一个重要概念,它与图论紧密相关。在图论中,一个图的闭欧拉迹是指从图中的某个顶点出发,沿着边行走,经过每条边恰好一次,最后返回起点的路径。这个概念是由18世纪的数学家莱昂哈德·...

    数字图像处理算法之形态学运算先闭后开操作对指纹去噪Delphi 源码

    在本文中,我们将深入探讨数字图像处理中的一个关键领域——形态学运算,特别是先闭后开操作在指纹去噪中的应用。我们将结合Delphi编程语言的源码来解析这一过程。 首先,我们要理解形态学运算是图像处理的一种基础...

    形态学开闭运算平滑图像

    "形态学开闭运算平滑图像"这个标题所涉及的核心知识点就是形态学处理中的开运算和闭运算,以及它们在平滑图像、填充孔洞方面的应用。Opencv是一个广泛使用的开源计算机视觉库,它提供了丰富的功能来实现这些操作。 ...

    Minimum Snap轨迹规划详解(3)闭式求解1

    《Minimum Snap轨迹规划详解(3)闭式求解1》 在轨迹规划中,Minimum Snap是一种常见的优化技术,旨在寻找一条具有最小加速度变化(snap)的路径,以实现平滑且快速的运动。本篇将详细介绍闭式求解Minimum Snap轨迹...

    不相交的闭区间的并

    给定n个闭区间[ai, bi](1 ),这些区间的并可以表示为一些不相交的闭区间的并。要求在这些表示方式中找出包含不相交区间数目最少的方案。 【输入形式】 输入文件为当前目录下的prz.in。 该文件的第一行包含一个...

    和变频调速型闸门启闭机的应用研究.zip

    其中,变频调速技术与闸门启闭机的结合应用,已经成为提升水闸运行效率和可靠性的重要手段。变频调速技术可实现电机速度的灵活控制,显著提高了启闭机的运行性能,尤其在精准流量控制和延长设备使用寿命方面表现出...

    将war、jar包反编译成项目的软件

    反编译是将已编译的字节码转换回源代码的过程,这对于理解已有的闭源项目或者分析恶意软件的行为非常有用。在Java世界里,有一些工具可以帮助我们完成这个任务,例如本文提到的`jd-gui`。 `jd-gui`是一款开源的Java...

    基于PLC的控制系统在闸门液压自动启闭机上的应用.pdf

    在探讨基于可编程逻辑控制器(PLC)的控制系统在闸门液压自动启闭机上的应用时,我们需要先了解PLC控制系统的基本概念、工作原理以及在液压自动启闭机中的具体实施方式。 首先,PLC控制系统是自动化领域中的一种...

    基于51单片机的电子存包柜的实现.zip

    控制电路连接单片机与锁具,根据指令控制锁的开闭;显示电路通常使用LED或LCD显示存包状态和操作提示;输入输出接口则用于接收用户输入,如按键操作,以及对外部设备的控制。 软件设计部分,主要涉及程序流程控制、...

Global site tag (gtag.js) - Google Analytics