`
weigang.gao
  • 浏览: 491016 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

闭包(1)

 
阅读更多

     闭包是指有权访问另一个函数作用域中的变量的函数。创建闭包的常见方式,就是在一个函数内部创建另一个函数,以createComparisonFunction()函数为例:

<script type="text/javascript"> 
	/*tag1与tag2是内部函数(一个匿名函数)中的代码,这两行代码访问了外部函数中的变量propertyName。即使这个内部函数被返回了,而且是在
	其他地方被调用了,但它仍然可以访问变量propertyName。之所以还能访问这个变量,是因为内部函数的作用域链中包含createComparisonFunction()
	的作用域。要彻底搞清楚其中的细节,必须从理解函数第一次被调用的时候都会发生什么入手。
	*/
        function createComparisionFunction(propertyName){
		   
		   return function(object1, object2){
		      var value1 = object1[propertyName];//tag1
			  var value2 = object2[propertyName];//tag2
			  
			  if(value1 < value2){
			     return -1;//如果第一个参数应该位于第二个参数之前,返回负数
			  }else  if(value1 > value2){
			     return 1;
			  }else{
			     return 0;
			  }
		   }
		}
</script>

       在另一个函数内部定义的函数会将包含函数(外部函数)的活动对象添加到它的作用域链中。因此,在createComparisonFunction()函数内部定义的匿名函数的作用域链中,实际上将会包含外部函数createComparisonFunction()的活动对象。图7-2展示了当下列代码执行时,包含函数createComparisonFunction()的作用域链 。

var compare = createComparisonFunction('name');



 

在匿名函数从createComparisonFunction()中被返回后,它的作用域链被初始化为包含createComparisonFunction()函数的活动对象和全局变量对象。这样,匿名函数就可以访问在createComparisonFunction()中定义的所有变量。更为重要的是,createComparisonFunction()函数在执行完毕后,其活动对象也不会被销毁,因为匿名函数的作用域链仍然在引用这个活动对象。换句话说,当createComparisonFunction()函数返回后,其执行环境的作用域链会被销毁,但它的活动对象仍然会留在内存中;直到匿名函数被销毁之后,createComparisonFunction()的活动对象才会被销毁。

图7-3展示了调用compare()的过程中产生的作用域

var result = compare({name:"Nicholas"}, {name:"Greg"});


        首先,创建的比较函数被保存在变量compare中。而通过将compare设置为null解除该函数的引用,就等于通知垃圾回收例程将其清除。随着匿名函数的作用域链被销毁,其他作用域(除了全局作用域)也都可以安全地销毁

 

  • 大小: 13.6 KB
  • 大小: 14.8 KB
  • 大小: 21.8 KB
分享到:
评论

相关推荐

    关系闭包的计算

    1. **自反闭包**:给定集合A上的关系R,如果对于集合A中的每一个元素x都有,x&gt;∈R,则称R是自反的。若关系R不是自反的,则可以构造一个最小的自反关系R'⊇R,这个R'就是R的自反闭包。 2. **对称闭包**:对于集合A上...

    22.1、闭包1

    1. 非静态内部类(也称为成员内部类),它直接与外部类的一个实例关联。这种方式创建的闭包可以访问外部类的实例变量,但需要外部类对象的存在。 2. 静态内部类,它不依赖于外部类的实例,但是仍然可以访问外部类的...

    8.闭包1

    1. 当没有声明变量a时,直接赋值,如`a = 1`,这实际上是创建了一个全局变量。如果在函数内部这样做,对于局部作用域来说,赋值即创建,如果外部有相同变量名,则会遮挡外部的变量。 2. 如果没有对变量进行赋值,如...

    02_JS内存管理和闭包1

    JavaScript的内存管理和闭包是JavaScript编程中的核心概念。在编程中,内存管理是至关重要的,因为它关乎程序的性能和稳定性。JavaScript是一种动态类型的脚本语言,它的内存管理主要是由垃圾回收(Garbage ...

    函数装饰器和闭包1

    闭包是函数的一个特性,它可以访问并记住其定义范围内的非全局变量,即使这些变量在其外部作用域中。闭包中的自由变量(未在本地作用域中绑定的变量)在函数调用时仍然可以访问。Python中的`nonlocal`关键字用来声明...

    wistbean#fxxkpython#Python 闭包1

    闭包可以让使用者访问到函数内部的数据,也就是可以拿到在闭包内所提供的隐藏数据。如果某个功能只需要一个函数,可以使用闭包而不需另创建一个类。第一次将参数传入并 保

    深入理解javascript原型和闭包1

    这里,我们深入探讨一下JavaScript中的对象、函数、原型以及闭包。 (2)——函数和对象的关系 函数在JavaScript中被视为一种特殊的对象,它们不仅可以拥有属性和方法,还可以作为参数传递和作为其他函数的返回值。...

    ianjiang#functional_programming_note#3.5.2-使用闭包1

    闭包的几个例子:变量的捕获发生在创建闭包的时候,isOdd不会察觉isEven。作为私有变量的o被可能意外修改,为了避免,需要把捕获变量私有:在这个例子里,PR

    TomatoZ7#notes-of-tz#004_闭包1

    实现 1:动态添加属性实现 2:利用闭包的方式示例 2:计算打车费用// 起步价 3 公里 13 元,超出 3 公里每公里加收 5 元// 拥堵费用额外收取 1

    closure闭包1

    1. **闭包定义** - 闭包的语法通常是大括号 `{}` 内包含一系列语句。如果闭包有参数,那么参数会放在大括号前,并通过 `-&gt;` 分隔参数列表和代码块。例如: ```groovy { param -&gt; println param } ``` - 如果...

    yjc930214#Blog-1#闭包1

    1.可以读取函数内部的变量 2.可以是变量的值长期保存在内存中,生命周期比较长 3.可以用来实现JS模块

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

    1. **传递闭包**:在一个关系集合中,如果对于所有的元素a、b和c,只要a与b有关系且b与c有关系,那么a与c也一定有关系,这样的关系被称为传递闭包。在图论中,这相当于寻找最长路径或可达性。 2. **自反闭包**:...

    MISSAJJ#MISSAJJ_IOS_DEVELOPMENT_BOOK#08.Swift-闭包1

    类型:值:^(参数列表) {// 执行的代码使用闭包代替block定义网络请求的类class HttpTool: NSObject {print("加载数据",

    计算NFA中ε闭包

    在这个例子中,状态1的ε闭包包含状态2;状态2的ε闭包包含状态4;状态3的ε闭包包含状态4;状态4的ε闭包包含状态5;状态5的ε闭包包含状态2和状态3。 #### 五、总结 通过上述程序,我们可以有效地计算给定NFA中...

    mikouhero#The_Right_Way_Of_Growth#08、回调与闭包1

    回调与闭包回调函数回调函数就是在主进程执行当中,突然跳转到预先设置好的函数中去执行的函数.回调函数的写法- 函数字符串//模拟数据库插入//模拟生成1001条数

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

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

    Java闭包 Java闭包

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

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

    1) 将函数依赖用multimap,string&gt; 存储,因为函数依赖可能会有一对多,例如:A-&gt;X,A-&gt;Y;多重映射可以存储,一一映射只能能存储一对一。 2) 熟悉全排列组合的算法,即列出Cnk的所有可能结果(从Cn­­­1,Cn2,….,...

    JoV5#blog#4.7 【ES5】严格模式与闭包1

    3. 访问arguments.callee或函数的caller属性将导致“类型错误(TypeError)” 4. 以下代码的执行效果与非严格模式并不一致:js

Global site tag (gtag.js) - Google Analytics