闭包,是JS里很重要的一个概念,也是相对来讲不太容易理解的一个东西,不过即使难理解,我们也要迎难而上啊,嘿嘿,网上有很多文章都在讲闭包,我在看JS设计模式的时候,书里也着重讲了闭包,但是书里官方的的确是不太容易理解,而网上很多高手也对闭包进行了相对容易理解一些的解释,我也参考大家的文章,按自己理解的闭包,做个学习总结~如果有不对的地方,谢谢路过的读者慷慨指出。下面我们不说废话进入正题。

  我们这里不着急先说闭包是个什么东西,先说说闭包形成的原因,为什么会出现闭包这个东西。对于计算机语言来讲,最重要的不是计算,而是存储,JS也是一样的,而提到存储,我们就应该想到变量,提到变量,我们要说两个相关概念:作用域和生存周期。

  JS的作用域,有全局作用域和函数作用域,如果我们不用关键字var去声明变量,这个变量就是全局变量,而全局变量,在任何位置都能访问,而且永远都会存在,除非我们主动销毁,这样的变量占用内存并且容易造成命名冲突,所以非必要,我们不要这样声明变量。而我们使用var关键字在函数中声明的变量,就是局部变量,这个变量只有在函数内部才能被访问,函数外部访问不到,而且当函数执行的时候,会生成变量,而函数调用结束后,变量也会被销毁。简单来说,就是函数在运行的时候,可以访问到函数内部的变量,也可以访问函数上一层级的变量,但是在函数外面,不能访问函数内部的变量,函数和函数之间,也不能互相访问对方的变量,而且函数里的变量,就只有在运行的时候存在。但有些情况下,我们需要访问函数内部的变量,这样,闭包就产生了。

  所以闭包是什么呢?简单来说,闭包就是能够读取其他函数内部变量的函数。我感觉闭包其实就像个小门一样,函数就像一个屋子,屋子里有卧室、厨房、卫生间,本来这个屋子只有一个门可以进去,我们想进卫生间的话,就只能从这个大门进去,然后再进卫生间,而闭包就像个小门一样,在卫生间另开了一个门,我们在整间屋子的外面,想进屋里的卫生间,如果有了小门,我们就不用走大门进去,而是打开小门,直接就进到了卫生间里。闭包其实就是这个小门~

  下面我们来段代码帮助理解一下:

function house() {
var a = "手机";   
function wc() {
alert("我从卧室里拿了"+a+"上厕所~");
}
wc();  
} 
house();

  看这段代码,我们在house这个函数里声明了一个变量a,用于存放手机,这部手机我们放在屋子里了,假设我们在客厅看电视,突然想上厕所,大家都知道,不拿手机没法上厕所啊,所以我们拿起茶几上的手机进了厕所,这是正常情况下,我们在屋子里,可以上厕所,但是如果我们在屋子外边 怎么办?着急上厕所,屋子锁门了,我们进不去啊!这个时候,我们就像,如果厕所有个小门开着就好了,我们不就可以直接上厕所了吗?还可以顺便拿上客厅的手机~嘿嘿,在js中,我们可以使用闭包来实现这个过程,代码如下:

function house() {
var a = "手机";   
function wc() {
alert("我从卧室里拿了"+a+"上厕所~");
}
return wc;  
} 
var goWc = house();
goWc();

  看上面的代码,goWc其实就是我们留的这个小门,而return wc它其实是一个指针,只是指向这个小门,告诉你说这里有条路可以直接进卫生间,但是并没有进入卫生间的这个动作,那我们怎么进卫生间的呢?我们给goWc后面加了个(),就执行了进入卫生间的这个动作了~

对JS闭包的理解的更多相关文章

  1. JS闭包的理解及常见应用场景

    JS闭包的理解及常见应用场景 一.总结 一句话总结: 闭包是指有权访问另一个函数作用域中的变量的函数 1.如何从外部读取函数内部的变量,为什么? 闭包:f2可以读取f1中的变量,只要把f2作为返回值, ...

  2. 个人对js闭包的理解

      闭包算是前端面试的基础题,但我看了很多关于闭包的文章博客,但感觉很多对于闭包的理想还是有分歧的,现在网上对闭包的理解一般是两种: 有些文章认为闭包必须要返回嵌套函数中里面用到外面函数局部变量的方法 ...

  3. 【闭包】JS闭包深入理解

    先看题目代码: 1 2 3 4 5 6 7 8 9 10 11 12 function fun(n,o) {  console.log(o)  return {   fun:function(m){ ...

  4. 浅谈对Js闭包的理解

    理解Js的闭包,首先让我们先看几个概念 执行环境(executive environment)每个函数都有自己的执行环境,匿名函数默认为全局环境. 作用域链(scope chain)子函数继承父函数, ...

  5. js 闭包原理理解

    问题?什么是js(JavaScript)的闭包原理,有什么作用? 一.定义 官方解释:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 很显然 ...

  6. 从循环添加事件谈起对JS闭包的理解

    1.引子 相信很多初学js的人,都遇到这样一种情况:想要给一堆按钮添加各自的事件,比如点击第i个按钮时,弹出i这个值.理所当然地,我们会这样写: var buttons = document.getE ...

  7. js闭包的理解-目前网上分析的最透彻文章

    js的闭包对于大家实际上并不陌生,但是真正敢说自己完全理解的人并不多.笔者在网上看到分析闭包的文章非常多,篇幅用的非常多,但是实际上分析的并不到位,或者根本就是不正确的.我有时候都在想,写这些文章的人 ...

  8. JS闭包的理解

    闭包的两个特点: 1.作为一个函数变量的一个引用 - 当函数返回时,其处于激活状态.2.一个闭包就是当一个函数返回时,一个没有释放资源的栈区. 其实上面两点可以合成一点,就是闭包函数返回时,该函数内部 ...

  9. JS闭包深入理解(理解篇)

    看书的时候很是不明白为啥变量老是五,经过认真思考的出一下理解: function box() {   var arr = [];   for (var i = 0; i < 5; i++) {  ...

随机推荐

  1. android项目引入第三方库工程出现的问题及解决方案

    一.导入libar库工程 1.使用第三方库工程libary,基本上都是从github上下载,解压后里面有个libary文件夹 2.将libary导入到eclipse中,步骤如下 1)在eclipse包 ...

  2. Luogu【P1130】红牌(DP)

    欧拉 本蒟蒻第一个自己想出来的DP题 请移步题目链接 调了半天.i从1到n,j从1到m. f[i][j]表示的是第i道工序在第j个小组办完所花的最短时间. 因为要用到上一个状态,而上一个状态要么是同一 ...

  3. BZOJ 2595 [Wc2008]游览计划 ——斯坦纳树

    [题目分析] 斯坦纳树=子集DP+SPFA? 用来学习斯坦纳树的模板. 大概就是用二进制来表示树包含的点,然后用跟几点表示树的形态. 更新分为两种,一种是合并两个子集,一种是换根,换根用SPFA迭代即 ...

  4. 常州模拟赛d4t2 陶陶摘苹果

    题目描述 陶陶家的院子里有一棵苹果树,每到秋天树上就会结出 n 个苹果.苹果成熟的时候,陶陶就会 跑去摘苹果. 陶陶的手不能弯 (他仅能把手伸直),当且仅当陶陶达到的高度与苹果的高度相等的时候,陶陶 ...

  5. 【2018.2.8-】网络流学习笔记(含ISAP!)

    网络流的基础内容就不详细发了,网上到处都是,可自学. 总版点这里 ps:以下有些链接是hihocoder的题目(题面有详细讲解),请确保先登录hihocoder,再点击进入相应题目网页. 最大流 基础 ...

  6. Phantomjs和Casperjs,后台网页抓取和交互

    var casper = require('casper').create({ verbose: true, logLevel: 'debug', pageSettings: { loadImages ...

  7. (2)Swing窗体基本设置

    import javax.swing.*; import javax.swing.plaf.FontUIResource; import java.awt.*; import java.util.En ...

  8. 带你学Node系列之express-CRUD

    前言 hello,小伙伴们,我是你们的pubdreamcc,本篇博文出至于我的GitHub仓库node学习教程资料,欢迎小伙伴们点赞和star,你们的点赞是我持续更新的动力. GitHub仓库地址:n ...

  9. Unity3D 异步加载 在 场景加载 中的使用

    异步加载 我们想一想玩过的一些游戏,基本都会有加载界面——因为游戏场景数据较大,所以需要加载一小段时间.那为什么一些2D游戏也会有加载界面呢?按理说2D游戏场景会很小,这样做是为了让游戏跑在低端设备上 ...

  10. 树莓派LED指示灯说明

    原文:http://shumeipai.nxez.com/2014/09/30/raspberry-pi-led-status-detail.html?variant=zh-cn LED亮灯状态 LE ...