`
zwws
  • 浏览: 2244 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

顽皮的闭包

阅读更多
部分引用来源:http://www.cnblogs.com/rubylouvre/archive/2009/07/24/1530074.html


问题描述
有个函数fn, 定义在某作用域r中, 函数fn的定义语句中包含对作用域v的某个变量v的引用, 由于变量v的作用域在v中, 所以倘若函数a将变量v绑定到位于其他作用域的应用中时, 变量v无法以window.v 或者 obj.v 的形式在后期引用, 只好以指针或者变量地址方式保存在函数a中用以持久变量v.

问题实质
Javascript中的函数可通过作用域链来访问自身未定义的变量, 但是因为被引用的变量位于某局部作用域, 实际引用会导致其生命周期被持久维持, 形成闭包.

相关资料
引用
闭包,是指语法域位于某个特定的区域,具有持续参照(读写)位于该区域内自身范围之外的执行域上的非持久型变量值能力的段落。这些外部执行域的非持久型变量神奇地保留它们在闭包最初定义(或创建)时的值(深连结)。

理解 JavaScript 闭包
深入理解Javascript闭包(closure)

解决方案
1. 使用可访问的全局对象成员变量存储有效引用, 即局部变全局
2. 使用绑定时可访问的私有作用域的成员变量存储有效引用, 即私有的, 一对一的更多闭包

实例
<ul>
    <li id="a1">aa</li>
    <li id="a2">aa</li>
    <li id="a3">aa</li>
</ul>

<script type="text/javascript">

for (var i=1; i < 4; i++) {
    var id = document.getElementById("a" + i);
    // 这里生成了一个匿名函数并赋值给对象id_i;
    id.onclick = function() {
        // 这个i来源于局部变量,无法以window.i或者obj.i的形式在后期引用,
        // 只好以指针或者变量地址方式保存在这个匿名函数中,
        // 这就是传说的闭包,所以所有这个过程中生成的事件句柄都使用引用
        // 的方式来持久这个变量,也就是这些匿名函数共用一个变量i;
        alert(i); // => 现在都是返回4
    };
}

// 局部变全局

for (var i = 1; i < 4; i++) {
    var id = document.getElementById("a" + i);
    id.i = i; // 这个i有了根[1]
    id.onclick = function() {
        alert(this.i);
    };
};

for (var i = 1; i < 4; i++) {
    var id = document.getElementById("a" + i);
    window[id.id] = i; // 这个i有了根[1]
    id.onclick = function() {
        alert(window[this.id]);
    };
}

// 产生一对一的更多闭包

for (var i = 1; i < 4; i++) {
    var id = document.getElementById("a" + i);
    id.onclick = (function(i) {
        return function() {
            alert(i); // 这个i是实参的闭包[2]
        }
    })(i);
};

for (var i = 1; i < 4; i++) {
    var id = document.getElementById("a" + i);
    id.onclick = new function() {
        var i2 = i; // 这个i是闭包的闭包[2]
        return function() {
            alert(i2);
        }
    };
}

</script>
  • closure.rar (1.4 KB)
  • 描述: Test Case
  • 下载次数: 1
分享到:
评论

相关推荐

    C语言实现三种闭包算法(传递,自反,对称闭包)

    在计算机科学中,闭包是一种重要的概念,尤其在函数式编程和逻辑编程中。闭包在C语言中可能不如在一些动态类型的语言中那么常见,但依然可以通过巧妙的技巧实现。这里我们将详细讨论如何用C语言实现传递闭包、自反...

    离散数学-关系,集合,求自反闭包,对称闭包,传递闭包

    离散数学-关系,集合,求自反闭包,对称闭包,传递闭包 离散数学-关系,集合,求自反闭包,对称闭包,传递闭包 离散数学-关系,集合,求自反闭包,对称闭包,传递闭包 离散数学-关系,集合,求自反闭包,对称闭包...

    关系闭包的计算

    ### 关系闭包的计算 #### 实验背景与目的 在计算机科学与数学领域中,关系闭包是一种重要的概念,特别是在图论与数据库理论中有着广泛的应用。本实验旨在通过编程实践的方式帮助学习者深入理解关系闭包的概念,并...

    计算NFA中ε闭包

    ### 计算NFA中的ε闭包 #### 一、NFA与ε闭包概念介绍 **非确定有限自动机(NFA)**是一种理论计算模型,它扩展了确定有限自动机(DFA)的概念,允许在某些情况下从一个状态出发到达多个状态。在NFA中,存在一种特殊的...

    Java闭包 Java闭包

    JSR-335 将闭包引入了 Java 。闭包在现在的很多流行的语言中都存在,例如 C++、C# 。闭包允许我 们创建函数指针,并把它们作为参数传递。在这篇文章中,将粗略的看一遍Java8的特性,并介绍 Lambda表达式。而且将试...

    求闭包 属性集闭包 函数依赖的闭包

    3. 用户输入完毕所有的依赖后,显示“请输入属性集求闭包”的提示,当用户输入1个或者多个属性时,求出对应的闭包。(如,用户输入A,则显示A+的值, 用户输入AB则求出AB+的值。显示完毕后,再次显示“请输入属性集...

    数据库求属性集闭包&函数依赖闭包

    3) 计算属性集闭包的算法,在课件里有详细说明。方法很简单,但用文字描述很抽象。。。。不解释。。。 4) 计算函数依赖的闭包。此步骤不作要求,但要会方法。个人总结:将所有属性元素组成一个集合(域)记为R;...

    用矩阵求自反闭包自反闭包

    在计算机科学和图论中,自反闭包是与关系理论相关的概念,特别是在布尔代数和图的子结构分析中。自反闭包是指给定一个关系R,将其扩展为包含所有起点到自身的元素对,即对于每一个元素a,都有(a, a)属于自反闭包。这...

    Swift之闭包ClosureDemo

    Swift中的闭包是一种强大的编程概念,它允许我们定义一段可移动和可重用的代码块,可以在函数中作为参数传递,也可以作为返回值。闭包在很多编程语言中都有类似的概念,但在Swift中,它们的设计既简洁又灵活,使得...

    最符合菜鸟的闭包

    闭包是编程语言中的一个重要概念,特别是在JavaScript等函数式编程语言中。对于初学者来说,它可能显得有些抽象,但理解闭包对于提升编程技能至关重要。闭包是一种特殊的作用域,它允许函数访问并操作其外部作用域的...

    内存泄露,闭包 内存泄露,闭包 内存泄露,闭包

    内存泄露和闭包是两个关键概念,它们紧密关联并可能对程序性能产生重大影响。 内存泄露是指程序在不再需要某些数据时,未能释放这些数据所占用的内存。在JavaScript中,由于其自动垃圾回收(Garbage Collection, GC...

    原子闭包系统, 原子闭包算子和原子全蕴含系统

    原子闭包系统、原子闭包算子以及原子全蕴含系统是数理逻辑、抽象代数以及数学基础理论中的概念。在本篇文章中,作者杨海建、李庆国和何霞辉对这些概念进行了深入探讨,同时也研究了它们之间的相互关系,并且提出了...

    二元关系的闭包运算

    常见的闭包有传递闭包、自反闭包和对称闭包。 1. **传递闭包**:如果关系R满足这样的性质:对于所有a, b, c属于A,若aRb且bRc,则aRc,我们就说R是传递的。传递闭包是包含R及其所有可能通过传递性推导出的元素对的...

    Javascript 闭包完整解释

    ### JavaScript闭包完整解释 #### 一、闭包的基本概念 **闭包**是一个非常重要的JavaScript概念,它指的是一个函数能够记住并访问其外部作用域中的变量的能力,即使该函数在其外部作用域之外被调用也是如此。具体...

    ios-闭包传值.zip

    在iOS开发中,闭包(Closure)是一种强大的编程工具,它允许我们定义代码块并可以在程序的不同地方作为值传递。闭包可以捕获和存储它所在上下文中的常量和变量,这使得它们非常适合用于异步操作、回调函数或者封装一...

    js闭包详细讲解

    ### JavaScript闭包详解 #### 一、闭包概念与特性 **闭包**是JavaScript语言的一个重要特性,它使得函数可以访问并操作其外部作用域内的变量,即使该函数在其外部作用域之外被调用。要理解闭包,首先需要了解...

    JS闭包可被利用的常见场景

    JavaScript 闭包是一种强大的编程工具,常常被用来解决特定的问题和优化代码结构。在JavaScript中,闭包是指一个函数能够访问并操作其定义时的作用域内的变量,即使该函数在其外部作用域被调用。以下将详细介绍两个...

    Swift 中的闭包和 Objective-C 中的Block

    Swift中的闭包和Objective-C中的Block是两种编程语言中实现匿名函数的关键特性,它们允许我们定义可以在不同上下文中使用的代码块。尽管这两种语言都属于Apple的生态系统,但它们在闭包和Block的概念上有细微差别。 ...

    js闭包个人理解

    ### JavaScript闭包的理解 在JavaScript中,闭包(Closure)是一种非常重要的概念,它涉及到函数作用域、变量生命周期以及函数内部对外部作用域的访问等多个方面。本文将基于提供的文件内容,深入探讨JavaScript...

Global site tag (gtag.js) - Google Analytics