菜鸟所理解的闭包

  对于新手来说,闭包的概念往往有些晦涩。书上的概念描写的非常简短,网上的各类文章又常常是长篇大论地探讨闭包的作用呀,影响呀,看到最后,觉得是越看越晕,越来越搞不懂什么是闭包了,所以在这里分享自己对闭包的浅显的理解,希望对新手有所帮助,相互交流。

>>进入主题

  什么是闭包:闭包是指有权访问另一个函数作用域的变量的函数。--《javascript高级程序设计》

  书上的概念就这么一句话,其实闭包就是像这句话定义的一样简单。如果有一个函数fun2,它可以访问在其它函数如fun1中的局部变量,那么它(fun2)就是闭包。创建闭包的简单方式,就在在函数内部创建另一个函数,下面例子创建了个简单的闭包

1 function fun1 () {
2     var  a = 0;
3     function fun2 () {
4         console.log(a); // 在这个函数fun2中可以访问另一个函数中的变量a,所以fun2()就是一个闭包。
5     }
6     fun2();
7 }

  上面这个闭包运行其实和大家所熟悉的函数运行没什么两样,也不会出现各种关于闭包的问题,正常地访问外部函数的变量,数据。以上就是闭包的定义,非常简单,我们不用把它想得过于复杂。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~定义分割线~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  那么问题来了,为什么闭包那么重要呢,不是说好的有各种注意事项的么。是的,我们通常可以像上面那样直接在外部函数内调用函数,即直接调用闭包。但是有时候会出现其他的调用情形,在其他地方调用内部函数(闭包),使这个闭包逃离定义它们的外部函数。

  所以接下来我们简单讨论闭包如何在其他地方被调用(逃离),以及会产生怎样的影响(基于闭包在其他地方被调用的情形,并不是所有闭包都会出现这种影响)

  逃离方式:

    1.将内部函数指定给一个全局变量;

var globalVar;
function outer() {
    console.log(‘outer‘);
    function inner(){
        console.log(‘inner‘);
    }
    globalVar = inner;
}
outer(); // outer
globalVar(); // inner;

在这个例子中inner()通过全局变量的引用成功逃离,现在可以在全局中调用,而且可以引用outer()的变量

    2.通过返回值来‘营救‘内部函数的引用

function outer() {
    console.log(‘outer‘);
    function inner(){
        console.log(‘inner‘);
    }
   return inner;
}
var fn = outer(); // outer
fn(); // inner;

在这个例子中inner()通过返回值成功逃离,现在可以在全局中调用,而且可以引用outer()的变量

  上面两个例子中对内存的影响:

    本来正常的情况下是函数调用结束之后函数的执行环境离开环境栈,定义的变量废弃(废弃与垃圾收集机制有关),活动变量(变量对象)会被销毁,内存释放。但是现在因为闭包的作用域链包含了外部函数的变量对象,外部函数的变量有可能再被引用,垃圾收集机制不会将外部函数的变量废弃,在内存保留的外部函数的变量对象。这样就加大了对内存的占用。

时间: 2024-10-08 06:12:01

菜鸟所理解的闭包的相关文章

深入理解Java闭包概念

闭包又称词法闭包 闭包最早定义为一种包含<环境成分>和<控制成分>的实体. 解释一:闭包是引用了自由变量的函数,这个被引用的变量将和这个函数一同存在. 解释二:闭包是函数和相关引用环境组成的实体. 注:<自由变量>:除了局部变量的其他变量 简单理解:闭包能够将一个方法作为一个变量去存储,这个方法有能力去访问所在类的自由变量. Java中闭包实现 关键点: 如何用变量去存储方法? java中能够保存方法的变量指的就是普通的对象 如何让这个普通对象能够访问所在类的自由变量?

理解js闭包原理

各种专业文献上的"闭包"(closure)定义非常抽象,很难看懂.我的理解是,闭包就是能够读取其他函数内部变量的函数. 由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成"定义在一个函数内部的函数". 所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁. 闭包可以用在许多地方.它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中. 怎么来理解这句话呢?请看下面的

轻松理解JavaScript闭包

摘要 闭包机制是JavaScript的重点和难点,本文希望能帮助大家轻松的学习闭包 一.什么是闭包? 闭包就是可以访问另一个函数作用域中变量的函数.下面列举出常见的闭包实现方式,以例子讲解闭包概念 function f1(){ var n=999; nAdd=function(){n+=1} function f2(){ alert(n); } return f2; } var result=f1(); result(); // 999 nAdd(); result(); // 1000 f1是

javascript深入理解js闭包(看了挺多的,感觉这篇比较透彻)

闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量. Js代码 var n=999; function f1(){ alert(n); } f1(); // 999 另一方面,在函数外部自然无法读取函数内的局部变量. Js代码 function

理解JAVASCRIPT 闭包

最近去面试了一家企业,结果非常灰心丧气,于是周末给自己定了一个目标 学好一门,学精通一门.不求多,只求懂. 最近看到一个概念"闭包". 什么是闭包呢? 简单一点就是:看得到多和看得到少的区别. 上面这句话是我自己总结的,或许不太准确. 你能看到的多少这句话该如何理解呢? 下面随便丢一段代码: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 var name="Peter"; funct

菜鸟心中理解的大数据

近些年,比較热门的话题--大数据. 前期我也是对其兴趣备至,认为这个技术不错.互联网通过採集系统,把你在网络上的行为记录下,而且存在起来,一天.两天.十天.一个月.一年.十年.二十年更久.这样就形成了我们理解的大数据基础数据. 以后你再打开网页.系统通过对你的历史行为分析,模糊统计提供你訪问频率较高的信息或相关信息. 各种数据聚集,各种用户信息採集,各种数据分析: 以前有人用苹果公司的IPhone手机通过定位服务->常去地点->地点记录.就能分析出这个人相关工作,个人生活规律. 比如:你每天都

深入理解Javascript闭包概念

一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量. Js代码 var n=999; function f1(){ alert(n); } f1(); // 999 另一方面,在函数外部自然无法读取函数内的局部变量. Js代码 function f1(){ var n=999; } alert(n); // error 这里有一个地方需要注意,函数

深入理解javascript闭包(一)

闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 一.什么是闭包? 官方"的解释是:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 相信很少有人能直接看懂这句话,因为他描述的太学术.其实这句话通俗的来说就是:JavaScript中所有的function都是一个闭包.不过一般来说,嵌套的function所产生的闭包更为强大,也是大部分时候我们所谓的"闭包". 要理

Python_基础个人理解_闭包

闭包 ---- 个人理解简述 闭包在某种含义上其本身其实也是一个函数. 定义的格式简单来说为在一个函数内部再创建一个函数, 也就是一个外函数包裹了一个内函数, 在内函数里使用了外函数的临时变量, 外函数的"return"返回值为内函数的引用(函数名). 在形式上与循环嵌套有些相似, 暂且也可称之为函数嵌套. 闭包的使用可以有效的隐藏函数内部的工作细节, 只给外部使用者提供一个可以执行的内部函数的应用. 如果在外函数里自定义了变量并且需要在内函数中对其进行修改, 需要将变量声明为 &qu