图解闭包
说到 闭包 ,这是js不得不提的一个特性,很多传统语言都不具备这样的特性,比如JAVA C等等。
之前看书的时候,总是理解不好什么是闭包!下面就通过手绘一张原理图,来理解一下:
首先基本上所有的编程语言都有类似的特性,局部方法可以访问外部父类方法的属性,也就是说,子类或子方法可以访问父类的资源。
<!-- 在正常的脚本中,某个方法可以获取到外部的变量,或者全局变量 --> var num = 11; function func1(){ console.log(num); } func1();
因此上面的这段代码,我们可以获取到num的值。
父类能否获取到子方法内部的值呢?
function func2(){ var num1 = 22; num2 = 33; } func2(); <!--console.log(num1); 会报错!--> console.log(num2); <!--可以获取到num2的值,因为不使用var定义变量时,默认是全局变量 -->
当然是不可以的,因为子方法的变量作用域仅仅是子方法的范围,外部是无法获取到的。
那么如何才能在外部获取到子方法的局部变量呢!
如果是java,一个类的私有属性,可以通过公共的get方法来获取,比如:
class Person{ private String name; public String getName(){ return name; } }
通过上面的方式可以获取到一个类内部的私有属性,同样的,在js中可以通过某个方法来获取这个方法的局部变量,然后通过这个方法内的方法来读取想要的变量值。
function func3(){ var num3 = 44; function func4(){ return num3; } return func4; } var func = func3(); console.log(func());
参考下面的图解:
在外部无法获取到func3内部的局部变量,但是func3内部的局部方法func4却可以获取到,因此 返回一个func4的引用 ,这样在外部通过这个func4就可以获取到func3的内部变量。
虽然是绕了一个圈子,但是在方法外部却通过这样一个手段获取到了内部的值。
而这个方法内的局部方法func4就叫做闭包,按照很多书上的概念,这个方法搭建了方法内部与方法外部的桥梁,使得在外部也可以任意的获取到方法内部的资源。
但是闭包会造成变量在内存中持久占用,因此会有一定的性能问题,最好不要轻易使用,即便使用也要在恰当的实际进行释放。
示例的源码:
<!doctype html> <html> <head> </head> <body> <script type="text/javascript"> <!-- 在正常的脚本中,某个方法可以获取到外部的变量,或者全局变量 --> var num = 11; function func1(){ console.log(num); } func1(); <!-- 但是在外部是无法获取方法内部的局部变量的 --> function func2(){ var num1 = 22; num2 = 33; } func2(); <!--console.log(num1); 会报错!--> console.log(num2); <!--可以获取到num2的值,因为不适用var定义变量时,默认是全局变量 --> <!-- 那么如何在外部获取到内部的变量呢!javascript可以办到 --> function func3(){ var num3 = 44; function func4(){ return num3; } return func4; } var func = func3(); console.log(func()); </script> </body> </html>
运行结果:
相关推荐
在计算机科学中,闭包是一种重要的概念,尤其在函数式编程和逻辑编程中。闭包在C语言中可能不如在一些动态类型的语言中那么常见,但依然可以通过巧妙的技巧实现。这里我们将详细讨论如何用C语言实现传递闭包、自反...
### 计算NFA中的ε闭包 #### 一、NFA与ε闭包概念介绍 **非确定有限自动机(NFA)**是一种理论计算模型,它扩展了确定有限自动机(DFA)的概念,允许在某些情况下从一个状态出发到达多个状态。在NFA中,存在一种特殊的...
### 关系闭包的计算 #### 实验背景与目的 在计算机科学与数学领域中,关系闭包是一种重要的概念,特别是在图论与数据库理论中有着广泛的应用。本实验旨在通过编程实践的方式帮助学习者深入理解关系闭包的概念,并...
3) 计算属性集闭包的算法,在课件里有详细说明。方法很简单,但用文字描述很抽象。。。。不解释。。。 4) 计算函数依赖的闭包。此步骤不作要求,但要会方法。个人总结:将所有属性元素组成一个集合(域)记为R;...
Swift中的闭包和Objective-C中的Block是两种编程语言中实现匿名函数的关键特性,它们允许我们定义可以在不同上下文中使用的代码块。尽管这两种语言都属于Apple的生态系统,但它们在闭包和Block的概念上有细微差别。 ...
JavaScript 闭包是一种强大的编程工具,常常被用来解决特定的问题和优化代码结构。在JavaScript中,闭包是指一个函数能够访问并操作其定义时的作用域内的变量,即使该函数在其外部作用域被调用。以下将详细介绍两个...
3. 用户输入完毕所有的依赖后,显示“请输入属性集求闭包”的提示,当用户输入1个或者多个属性时,求出对应的闭包。(如,用户输入A,则显示A+的值, 用户输入AB则求出AB+的值。显示完毕后,再次显示“请输入属性集...
在IT领域,三元闭包是一个重要的概念,特别是在社交网络分析和图论中。这个理论主要探讨了在社交网络中的关系连接模式,特别是在理解和描述个体之间的互动和连通性时起到关键作用。在这个场景中,"对于三元闭包的...
离散数学-关系,集合,求自反闭包,对称闭包,传递闭包 离散数学-关系,集合,求自反闭包,对称闭包,传递闭包 离散数学-关系,集合,求自反闭包,对称闭包,传递闭包 离散数学-关系,集合,求自反闭包,对称闭包...
JSR-335 将闭包引入了 Java 。闭包在现在的很多流行的语言中都存在,例如 C++、C# 。闭包允许我 们创建函数指针,并把它们作为参数传递。在这篇文章中,将粗略的看一遍Java8的特性,并介绍 Lambda表达式。而且将试...
在计算机科学和图论中,自反闭包是与关系理论相关的概念,特别是在布尔代数和图的子结构分析中。自反闭包是指给定一个关系R,将其扩展为包含所有起点到自身的元素对,即对于每一个元素a,都有(a, a)属于自反闭包。这...
闭包是编程语言中的一个重要概念,特别是在JavaScript等函数式编程语言中。对于初学者来说,它可能显得有些抽象,但理解闭包对于提升编程技能至关重要。闭包是一种特殊的作用域,它允许函数访问并操作其外部作用域的...
Swift中的闭包是一种强大的编程概念,它允许我们定义一段可移动和可重用的代码块,可以在函数中作为参数传递,也可以作为返回值。闭包在很多编程语言中都有类似的概念,但在Swift中,它们的设计既简洁又灵活,使得...
内存泄露和闭包是两个关键概念,它们紧密关联并可能对程序性能产生重大影响。 内存泄露是指程序在不再需要某些数据时,未能释放这些数据所占用的内存。在JavaScript中,由于其自动垃圾回收(Garbage Collection, GC...
离散实验报告求有限集上给定关系的自反、对称和传递闭包 在离散数学实验报告中,我们将学习如何求有限集上给定关系的自反、对称和传递闭包。这些概念是离散数学的重要组成部分,对于理解关系闭包的性质和应用具有...
常见的闭包有传递闭包、自反闭包和对称闭包。 1. **传递闭包**:如果关系R满足这样的性质:对于所有a, b, c属于A,若aRb且bRc,则aRc,我们就说R是传递的。传递闭包是包含R及其所有可能通过传递性推导出的元素对的...
### JavaScript闭包详解 #### 一、闭包概念与特性 **闭包**是JavaScript语言的一个重要特性,它使得函数可以访问并操作其外部作用域内的变量,即使该函数在其外部作用域之外被调用。要理解闭包,首先需要了解...
### JavaScript闭包完整解释 #### 一、闭包的基本概念 **闭包**是一个非常重要的JavaScript概念,它指的是一个函数能够记住并访问其外部作用域中的变量的能力,即使该函数在其外部作用域之外被调用也是如此。具体...
### JavaScript闭包的理解 在JavaScript中,闭包(Closure)是一种非常重要的概念,它涉及到函数作用域、变量生命周期以及函数内部对外部作用域的访问等多个方面。本文将基于提供的文件内容,深入探讨JavaScript...
《利用Warshall算法求二元关系的可传递闭包》 在离散数学中,二元关系是一个重要的概念,它描述了集合中的元素之间是否存在某种特定的联系。当需要研究这些关系并探究其性质时,有时我们需要计算关系的传递闭包。...