最近去面试了一家企业,结果非常灰心丧气,于是周末给自己定了一个目标

学好一门,学精通一门。不求多,只求懂。

最近看到一个概念“闭包”。

什么是闭包呢?

简单一点就是:看得到多和看得到少的区别。

上面这句话是我自己总结的,或许不太准确。

你能看到的多少这句话该如何理解呢?

下面随便丢一段代码:

var name="Peter";function outer(){var name="Tom";function inner(){return this.name;}return inner;  //返回函数inner,作为OUTER的一个返回值}var flag=outer();alert(flag()); //Peter

 大家也许会比较的疑惑,为什么返回的是Peter而不是Tom?

是不是认为编程的就近原则?

答案是:你还没有很好的理解闭包。

下面的一张图可以帮助大家理解一下,定义了一个flag对象,然后公共的函数是inner的父函数outer,

其实执行的是inner函数,因为outer函数返回对INNER函数的一个引用。

然后alert就是执行这个函数inner了。

我们要理解为什么是Peter而不是Tom,还需要了解一下闭包的作用域链。

那么,什么是作用域链呢?

看下面的代码;

function num()
{var number=0; //结果为4//number=0;    //结果为1number++;
}
var number=4;
num();alert(number);

  如果运行上述代码,在function内加var 和不加var的区别是很大的。

这就是文章下面要提到的JAVASCRIPT链式结构;

如果不声明var,那就表示这是一个全局变量,记住这一点概念很重要。

而在函数内部加了var以后,试想一下,外面的这个number和里面的number就没有任何的关系了,

所以最后的结果是4,是全部的number起作用。

如果没加var关键字,那么number就是属于window下的,默认this指向window(this.number),

外层的var=4会被自动替换成1.

如果想alert的值为4,只有一个办法,把

var number=4;
num();

的顺序替换一下^_^。

闭包的特性之一,就是可以在函数外部通过对象调用到函数内部的局部变量。

就好像是C#中,私有的变量,必须通过getter,setter方法来进行调用一样。

说白了,闭包,就是和上面说的可以类比。

再回到上面的问题,为什么name是window的而非function内部的局部变量的呢?

大家有没有发现 var flag=outer()这句话。

其实flag对象是指向window的。

而这个outer函数其实是返回了一个inner的引用。

所以,inner里的this.name(等同于outer().name)也被变成了一个window对象的引用。

所以,闭包不仅可以在外面访问函数内部的变量,

还可以改变内部变量的值,所以这一点大家要注意了,

非常危险的!慎用闭包。

比如下面的代码

name="Peter";var obj={name:"yang",innerFunc:function(){return function(){return this.name;}}}alert(obj.innerFunc()()); //Peter

通过外面可以改变里面局部变量的值,让其指向全局变量。

所以这就相当于形成了一个setter方法。

大家使用闭包的时候一定要小心啊。

另外最后再补充一下:

JAVASCRIPT的链式原理:

1.内部函数B形式参数,实际参数,函数,内部变量。

2.内部函数B的原型prototype

3.外部函数A的形式参数,实际参数,函数,内部变量。

4.WINDOW对象,活动对象(链式的顶端)

另外还有一点要注意,就是在闭包的时候,因为外部可以调用到内部函数的变量,并且是Writable的,所以内部

函数变量是一个“可持久的”,就是可以不受JAVASCRIPT的垃圾回收机制的影响。

而内部函数的变量根据链式原理对于外部的变量也是可持久的,这就造成了内,外的变量都具有可持久性,

这就形成了闭包,不过造成了这些变量越积越多,在内存中,从而影响程序的效率。

这个时候,就要在函数调用结束后删掉一些不必要的变量,否则严重的会造成内存泄漏。

好了,写完了,话说那个人问我怎么写JQUERY的分页,我没答出来,好好努力吧

O(∩_∩)O哈哈~

祝大家周末愉快,我是新手,有写得不合理的地方,请多多指正。



转载于:https://www.cnblogs.com/kmsfan/p/3734043.html

理解JAVASCRIPT 闭包相关推荐

  1. 让你分分钟理解 JavaScript 闭包

    原文:https://www.cnblogs.com/onepixel/p/5062456.html 让你分分钟理解 JavaScript 闭包 闭包,是 Javascript 比较重要的一个概念,对 ...

  2. 全面理解Javascript闭包和闭包的几种写法及用途--转载自https://www.cnblogs.com/yunfeifei/p/4019504.html...

    全面理解Javascript闭包和闭包的几种写法及用途 好久没有写博客了,过了一个十一长假都变懒了,今天总算是恢复状态了.好了,进入正题,今天来说一说javascript里面的闭包吧!本篇博客主要讲一 ...

  3. 深入理解JavaScript闭包(closure) 【收藏】

    深入理解JavaScript闭包(closure) 原文地址:http://www.felixwoo.com/archives/247  Felix Woo 最近在网上查阅了不少Javascript闭 ...

  4. (转)深入理解Javascript闭包(closure)

    深入理解Javascript闭包(closure) 一.什么是闭包?        "官方"的解释是:所谓"闭包",指的是一个拥有许多变量和绑定了这些变量的环境 ...

  5. 从λ演算到函数式编程聊闭包(2):彻底理解JavaScript闭包规则

    闭包是很多语言都具备的特性,上篇<从抽象代数漫游函数式编程(1):闭包概念再Java/PHP/JS中的定义> 闭包的特性 闭包有三个特性: 函数嵌套函数 函数内部可以引用外部的参数和变量 ...

  6. 全面理解Javascript闭包和闭包的几种写法及用途【转】

    一.什么是闭包和闭包的几种写法和用法 1.什么是闭包 闭包,官方对闭包的解释是:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.闭包的特点: 1. ...

  7. 全面理解Javascript闭包和闭包的几种写法及用途

     一.什么是闭包和闭包的几种写法和用法 1.什么是闭包 闭包,官方对闭包的解释是:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.闭包的特点: 1. ...

  8. [转载]深入理解JavaScript闭包(closure)

    最近在网上查阅了不少Javascript闭包(closure)相关的资料,写的大多是非常的学术和专业.对于初学者来说别说理解闭包了,就连文字叙述都很难看懂.撰写此文的目的就是用最通俗的文字揭开Java ...

  9. 深入理解Javascript闭包(一)

    闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用于.变量作用域包括 ...

  10. 深入理解Javascript闭包

    收藏 最近在网上查阅了不少Javascript闭包(closure)相关的资料,写的大多是非常的学术和专业.对于初学者来说别说理解闭包了,就连文字叙述都很难看懂.撰写此文的目的就是用最通俗的文字揭开J ...

最新文章

  1. 华为自研操作系统官宣了,但有机会成功吗
  2. oracle查询保留2位小数
  3. EasyUI环境搭建与入门基础语法
  4. springboot整个缓存_SpringBoot中整合Redis(缓存篇)
  5. 洛谷 P1352 没有上司的舞会(树形 DP)
  6. Redis线上救命丸:01---误操作AOF、RDB恢复数据
  7. c++interesting转换为uint_拆一款C转HDMI转换器,没想到一个简单的产品里面这么多芯片...
  8. 使用libbpf-bootstrap构建BPF应用程序
  9. Castle 开发系列文章
  10. PAT1030.——完美数列
  11. c语言回文串试题,最短回文串 -- C语言
  12. 0.Java介绍(Java语言特点,什么是JDK、JRE、JVM,Java开发注意事项和细节说明,Java转义字符)
  13. word嵌入对象依损坏_在Word 2010中,当文档中插入图片对象后,可以通过设置图片的文字环绕方式进行图文混排,下列是Word提供的文字环绕方式的是()。...
  14. 苹果手机如何制作铃声
  15. iterator的用法
  16. Git Gitosis
  17. 工作-一个依赖依赖的依赖导致的血案
  18. 静态网站和动态网站的区别
  19. 抖音seo源码.源代码开发可二开搭建/抖音seo优化系统代开发
  20. open-set recognition(OSR)开集识别的一些思考(二)

热门文章

  1. linux需要的GLIBCXX版本,Linux下GLIBCXX和GLIBC版本低造成的编译错误的解决方案
  2. linux 查看usb端口_linux开发:Linux下查看端口占用
  3. SQL注入 mysql4.0版本_SQL注入(上)
  4. left join on or 优化_pandas中merge/join有什么区别?
  5. idea java sdk找不到指定文件路径_java-IntelliJ找不到任何声明
  6. python识别复杂验证码2020_Python识别验证码!学会这步,百分之60的网站你基本都能识别了!...
  7. java排序算法 sort_Java排序算法之SleepSort排序示例
  8. 组播vlan_【参与方式】耗时10小时编撰(下)带你轻松通关组播知识点!
  9. sqlserver中某列转成以逗号连接的字符串及逆转、数据行转列列转行
  10. 解决log4j.properties不起作用的问题