闭包是什么?

·了解闭包首先了解js的‘链式作用域’结构,对象可以一级一级的向上查找父对象的变量,所以父对象的变量对子对象可见,反之不成立;所以都可以访问全局变量

·为了解决函数外部无法访问函数内局部变量的问题,就在父函数中定义一个子函数并让它访问了父函数的局部变量,再通过父函数返回该子函数就实现了调用局部变量的效果;

·而上面中的子函数就是闭包,所以闭包的定义是“能够读取其他函数内部变量的函数”,其实简单理解就是“一个定义在函数中的函数”;

示例

  function parent(){
var a=,b=;
function child(){
console.log(a+b);
}
return child;
}
var func1=parent(); //这是将子函数返回给变量
func1();

使用闭包有什么好处?

在内存中维持一个变量,由于闭包,f1中的n只有通过f2方法访问到,无法通过其他途径访问修改,从而达到了保护变量安全的效果;通过闭包实现了js私有属性和私有方法的效果;

function f1(){

//闭包f2被外引用始终存在内存中,而它所依赖的f1也会始终存在

//所以n,m都是始终存在,删除闭包直接f1=null;

n=1,m=100;

madd=function(){

m+=10;

alert(m);

}  //全局变量madd

function f2(){

n+=1;

alert(n);

}

return f2;

}

var a=f1(); //将子函数返回赋值给了变量a

a();

madd();

//madd的值是一个匿名函数,同时是一个闭包,实现了外部对函数内部进行操作

a();

使用闭包的注意点:

·闭包会使函数中的变量一直存在内存上会导致内存消耗过大,所以不能滥用闭包,否则会造成网页性能问题,IE可能会造成内存溢出。最好的方式是在退出闭包前将不必要的局部变量删除。

·JavaScript垃圾回收机制,如果一个对象不再被引用,那么这个对象就会被GC回收,如果两个对象相互引用,而不再被第三方引用,那么这两个对象会被GC回收,上述父函数被子函数引用,子函数又被外部c引用,这就是父函数不被回收的原因;

·作用域链时为了保证在执行环境中有权访问的变量和方法是有序的,只能向上访问,到window终止,即作用域链向下访问是不被允许的;

JS闭包的简单理解。优缺点以及垃圾回收机制的更多相关文章

  1. js 闭包的简单理解

    let a = function(){ var i=0; let b = function(){ i++; alert(i); } return b; } let c = a(); c(); 这段代码 ...

  2. 理解Android Java垃圾回收机制

    Jvm(Java虚拟机)内存模型 从Jvm内存模型中入手对于理解GC会有很大的帮助,不过这里只需要了解一个大概,说多了反而混淆视线. Jvm(Java虚拟机)主要管理两种类型内存:堆和非堆.堆是运行时 ...

  3. 理解PHP的垃圾回收机制

    什么是垃圾回收机制 使用的是“引用计数”方式进行回收.简单地理解的话,就是每个分配的内存区域都有一个计数器,记录有多少个变量指针指向这片内存.当指向该片内存的指针数量为0,那么该片内存区域就可以被回收 ...

  4. Android内存优化3 了解java GC 垃圾回收机制1

    开篇废话 如果我们想要进行内存优化的工作,还是需要了解一下,但这一块的知识属于纯理论的,有可能看起来会有点枯燥,我尽量把这一篇的内容按照一定的逻辑来走一遍.首先,我们为什么要学习垃圾回收的机制,我大概 ...

  5. Android性能调优篇之探索垃圾回收机制

    开篇废话 如果我们想要进行内存优化的工作,还是需要了解一下,但这一块的知识属于纯理论的,有可能看起来会有点枯燥,我尽量把这一篇的内容按照一定的逻辑来走一遍.首先,我们为什么要学习垃圾回收的机制,我大概 ...

  6. 03 JVM的垃圾回收机制

    1.前言 理解JVM的垃圾回收机制(简称GC)有什么好处呢?作为一名软件开发者,满足自己的好奇心将是一个很好的理由,不过更重要的是,理解GC工作机制可以帮助你写出更好的Java程序. 在学习GC前,你 ...

  7. JVM虚拟机—JVM的垃圾回收机制(转载)

    1.前言 理解JVM的垃圾回收机制(简称GC)有什么好处呢?作为一名软件开发者,满足自己的好奇心将是一个很好的理由,不过更重要的是,理解GC工作机制可以帮助你写出更好的Java程序. 在学习GC前,你 ...

  8. Java中内存泄露及垃圾回收机制

    转自:http://blog.sina.com.cn/s/blog_538b279a0100098d.html 写的相当不错滴...................... 摘  要 Java语言中,内 ...

  9. 理解闭包的微观世界和JS垃圾回收机制

    function a() { ; function b() { alert(++i); } return b; } var c = a(); c(); 一.闭包的微观世界 如果要更加深入的了解闭包以及 ...

随机推荐

  1. Java同步数据结构之SynchronousQueue

    前言 严格来说SynchronousQueue并不是像它的名字那样是一种Queue,它更像是一个数据接力的交汇点,还记得在介绍Exchanger的时候提到过Exchanger可以看作是Synchron ...

  2. Swift 字面量

    所谓字面量,就是指像特定的数字,字符串或者是布尔值这样,能够直接了当地指出自己的类型并为变量进行赋值的值.比如在下面: let aNumber = //整型字面量 let aString = &quo ...

  3. android studio 低版本升级高版本的问题

    配置 适用场景 2.0 升级3.0  / 3.0升级3.1 gradle的问题注意每个AS版本的gradle插件都对应了gradle的版本 传送门 https://developer.android. ...

  4. nginx虚拟机无法访问解决

    .重要:修改配置文件使用虚拟机,否则怎么配置都不生效,添加如下用户 [root@host---- html]# ll /etc/nginx/nginx.conf -rw-r--r-- root roo ...

  5. stm32第一章cortex-M3处理器概述

    处理器特点 哈弗结构3级流水线内核 实现Thumb-2指令集,告别切换32位的arm指令和16位的Thumb指令,优化性能和代码密度 结合可配置的嵌套向量中段控制器Nvic,提供非屏蔽中断NMI和32 ...

  6. 知识点整理-mysql怎么查看优化器优化后的sql

    背景 1.新建两张表 CREATE TABLE t1 (m1 )); CREATE TABLE t2 (m2 )); 2.插入些数据 INSERT INTO t1 VALUES(, , , 'c'); ...

  7. manjaro-VM虚拟机vmmon错误

    1.安装AUR : vmware-systemd-serverices 2.启动服务: systemctl enable vmware.service systemctl start vmware.s ...

  8. 【DSP开发】硬件信号量在多核处理器核间通信中的应用

    硬件信号量在多核处理器核间通信中的应用 刘德保1,汪安民1,韩道文2 1.同方电子科技有限公司研究所,九江 332009:2.解放军电子工程学院 摘要: 在多核处理器的软件设计中,核间通信机制是关键所 ...

  9. 使用webpack搭建一个多页应用

     一.前言 最近需要为公司的活动写8个左右的移动端分享页面,有比较多的页面是公用的,如果用传统的方式来写的话,对于公用的代码抽取,css代码的压缩都是比较麻烦的,所以选择了webpack来搭建一个基本 ...

  10. Docker pull php:7.1-fpm的php.ini配置修改

    今天,换了 Deepin 操作系统,开发环境是通过 Docker 搭建的,具体结构如下: CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e ...