`

理解闭包

阅读更多

   闭包是JavaScript的高级功能,要想深入了解JavaScript就必须要吃透闭包。


看下面的代码:


 function f1(){
 
	var f1_i = 0;

	return function f2(){
		return ++f1_i;
	} 
 }

var f3 = f1();
alert(f3());//1
alert(f3());//2





上面的代码中的函数f2就是闭包。

闭包的概念:闭包”是一个表达式(一般是函数),它具有自由变量以及绑定这些变量的环境 。 这句话很不好理解,结合这个例子,所谓的自由变量就是f1_i,它被f2绑定了。
   

大家从运行的结果可以看出来函数f1的变量f1_i的值是在累加的,这就说明函数f1的内存空间没有释放,其实就相当于全局变量了,这就是闭包的一个应用;在JavaScript
中我们一直不希望有很多的全局变量,用闭包就可以解决这个问题,它不但使局部变量想全局变量那样常驻内存,而且外部不能随便修改这个变量(全局变量就谁都能修改了)。

好的,那么为什么函数f1的内存空间没有释放呢,这是因为f2是f1“活动对象”的属性,f3就是返回的f2,也就是仍然调用了f1的引用,所以f1不会被垃圾回收。
下面我们看JavaScript创建一个函数的过程:

1,创建“活动对象”,并创建它的属性对象arguments(这是一个类似数组结构的对象,保存了调用函数时传递的参数)。

2,将形参作为“活动对象”的属性,如果调用函数时传递的参数与形式参数一致,则将相应参数的值赋给这些命名属性(否则,会给命名属性赋 undefined 值)。

3,定义的内部函数(f2)会以其声明时所用名称为可变对象创建同名属性。

4,在函数内部声明的所有局部变量创建为可变对象的命名属性。

5, this 关键字的赋值。如果所赋的值引用一个对象,那么前缀以 this 关键字的属性访问器就是引用该对象的属性。如果所赋(内部)值是 null,那么 this 关键字则引用全局对象。
0
0
分享到:
评论

相关推荐

    闭包的理解

    这些是理解闭包的基础。 - **作用域(Scope)**:指的是变量或者函数可以被访问的范围。 - **变量作用域**:指变量在其定义范围内可以被访问。JavaScript中有两种主要的作用域类型:全局作用域和局部作用域。 - **...

    JS 闭包的理解

    在深入理解闭包之前,我们需要先了解JavaScript的作用域规则。 1. **作用域**:在JavaScript中,变量的作用域分为两种,全局作用域和局部作用域。全局变量在整个代码中都可访问,而局部变量只在其定义的函数内部...

    全面理解闭包机制

    深入理解闭包,我们需要了解JavaScript的执行环境、活动对象、作用域和作用域链。每个函数在执行时都有一个与之关联的执行环境,其中包括一个活动对象,用于存放函数的参数、局部变量和函数声明。作用域链则是决定...

    最符合菜鸟的闭包

    对于初学者来说,它可能显得有些抽象,但理解闭包对于提升编程技能至关重要。闭包是一种特殊的作用域,它允许函数访问并操作其外部作用域的变量,即使在外部函数执行完毕后仍然可以访问这些变量。 闭包的核心在于它...

    让你一句话理解闭包(简单易懂)

    作用域链是理解闭包的重要概念,它描述了在查找变量时,从当前作用域开始,逐级向上查找直到全局作用域的过程。在闭包的情况下,这个链还包括了闭包所关联的外部函数的作用域。因此,闭包使得函数的作用域链保持活跃...

    javascript闭包的理解

    标题《JavaScript闭包的理解》涉及的知识点主要围绕JavaScript编程中的一个重要概念——闭包。...对于初学者来说,理解闭包的原理和作用域链是非常有帮助的,而随着经验的增长,闭包会成为JavaScript编程中的一把利器。

    Swift之闭包ClosureDemo

    首先,我们要理解闭包的基本结构。在Swift中,闭包表达式提供了一种简洁的方式来写闭包。它通常由三部分组成:参数列表、箭头符号(->)和闭包体。例如: ```swift { (参数类型...) in // 闭包体 } ``` 闭包可以...

    understandingClosures:通过解释闭包所依赖的基本概念的一系列脚本来理解闭包

    了解闭包通过解释闭包所依赖的基本概念的一系列脚本来理解闭包主题目录包含 10 个脚本,涵盖了闭包功能所必需的每个主题,逐渐构建到对闭包的理解: 主题 01 - 输入 Javascript 话题 02 - Javascript 中的函数话题 ...

    JavaScript闭包函数

    闭包是ECMAScript (JavaScript)最强大的特性之一,但用好闭包的前提是必须理解闭包。闭包的创建相对容易,人们甚至会在不经意间创建闭包,但这些无意创建的闭包却存在潜在的危害,尤其是在比较常见的浏览器环境下...

    [深入理解JS闭包]帮助你快速学习js的闭包,简单高效的文档资源

    JavaScript 闭包是一种强大的特性,它允许函数访问和操作其外部作用域的变量,即使在其外部函数执行完毕后,闭包依然能...通过深入理解闭包,开发者可以更好地利用 JavaScript 的特性,写出更高效、更易于维护的代码。

    js闭包理解

    标识符解析、执行环境和作用域链是理解闭包的关键部分。执行环境维护了当前代码执行的上下文,包括变量和函数的引用。每个执行环境都有一个作用域链,用于在当前环境中查找变量。作用域链是由当前执行环境加上所有...

    javaScript闭包的理解

    理解闭包的关键在于掌握以下几个特点: 1. **函数嵌套**:闭包通常涉及一个函数内部定义另一个函数的情况。 2. **访问外部变量**:内部函数可以访问其外部函数的作用域中的变量。 3. **变量持久性**:通过闭包,...

    JavaScript闭包深入理解.pdf

    首先,我们来理解闭包的定义。官方解释可能较为抽象,但简单来说,JavaScript中的每个函数都可以视为一个闭包,尤其是当一个函数内部定义了另一个函数,并且内部函数引用了外部函数的变量时,就形成了一个强大的闭包...

    python高阶闭包练习题

    1. **作用域规则**:理解LEGB(Local, Enclosing, Global, Built-in)规则是理解闭包的基础。闭包可以访问定义在其外部函数的局部变量,但不能直接修改它们。 2. **闭包与匿名函数**:Python的`lambda`表达式可以...

    ios-闭包传值.zip

    通过理解闭包的语法、捕获列表、值传递以及内存管理,开发者可以更好地利用闭包进行复杂逻辑的实现,尤其是处理异步操作和回调时。在实际项目中,熟练掌握闭包的使用能够提高代码的可读性和维护性。

    js闭包详细讲解

    要理解闭包,首先需要了解JavaScript的作用域规则。 ##### 1.1 作用域 在JavaScript中,变量根据其声明的位置,可以分为两种类型: - **全局变量**:在整个程序中都可被访问。 - **局部变量**:只在其声明的函数...

    js学习之----深入理解闭包

    理解闭包对于编写高效、可维护的JavaScript代码至关重要。它可以帮助你更好地控制作用域、内存和函数的生命周期,从而写出更优雅的解决方案。虽然闭包可能在初学时难以理解,但一旦掌握,它将成为你JavaScript编程的...

Global site tag (gtag.js) - Google Analytics