浅谈js闭包理解


Posted in Javascript onMarch 28, 2019

闭包是js中的一大特色,也是一大难点。简单来说,所谓闭包就是说,一个函数能够访问其函数外部作用域中的变量。

闭包的三大特点为:

1、函数嵌套函数

2、内部函数可以访问外部函数的变量

3、参数和变量不会被回收。

举例来说:

function test(){
  var a=1;
  return function(){
  alert(a);
  }
 }
 var try=test();
 try();//弹出a的值

这个例子中,变量a在test方法外部是无法访问的,但test方法里面,嵌套了一个匿名函数,通过return返回,test作用域中的变量a,可以在匿名函数中访问。并且当test方法执行后,变量a所占内存并不会释放,以达到嵌套的函数还可以访问的目的。

闭包的作用在于,可以通过闭包,设计私有变量及方法。

举例来说:在java中创建perosn类,含有私有变量name。

public class Person{
 private String name='wy';
 public Person(val){
  name=val;
 }
 public void setName(val){
  name=val;
 }
 public String getName(){
  return name;
 }
}

在js中实现类似java创建类的功能:

(function(){
   var name="wangyu";
   Person=function (val) {
    name=val;
   }
   Person.prototype.setName=function(val){
    name=val;
   }
   Person.prototype.getName=function () {
    return name;
   }
  })();
  var person1=new Person("sj");
  alert(this.name)//undefined 因为在function作用域外不能访问
  alert(person1.getName());//sj

在function里面的name,由于是在function作用域中,所以外部无法访问,但是可以通过创建person对象,调用person的方法,来达到修改和访问name值的目的,类似于java类中的私有变量,外部无法访问,只能通过类方法访问。

再看一个私有变量的例子:

var aaa = (function(){
  var a = 1;
  function bbb(){
    a++;
    alert(a);
  }
  function ccc(){
    a++;
    alert(a);
  }
  return {
    b:bbb,    //json结构
    c:ccc
  }
 })();
 alert(aaa.a)//undefined 
 aaa.b();  //2
 aaa.c()  //3

总结:

1、闭包是指有权访问另一个函数作用域中的变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量。闭包的缺点就是常驻内存,会增大内存使用量,使用不当很容易造成内存泄露。

2、不必纠结到底怎样才算闭包,其实你写的每一个函数都算作闭包,即使是全局函数,你访问函数外部的全局变量时,就是闭包的体现。

以上所述是小编给大家介绍的对js闭包理解和动画详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
js获取下拉列表框中的value和text的值示例代码
Jan 11 Javascript
js匿名函数的调用示例(形式多种多样)
Aug 20 Javascript
JS JQUERY实现滚动条自动滚到底的方法
Jan 09 Javascript
JavaScript更改原始对象valueOf的方法
Mar 19 Javascript
JS事件添加和移出的兼容写法示例
Jun 20 Javascript
Bootstrap编写一个兼容主流浏览器的受众巨幕式风格页面
Jul 01 Javascript
JS 动态判断PC和手机浏览器实现代码
Sep 21 Javascript
使用AngularJS对表单提交内容进行验证的操作方法
Jul 12 Javascript
js使用generator函数同步执行ajax任务
Sep 05 Javascript
浅谈Vue数据响应
Nov 05 Javascript
详解原生JS回到顶部
Mar 25 Javascript
node crawler如何添加promise支持
Feb 01 Javascript
微信小程序中转义字符的处理方法
Mar 28 #Javascript
微信小程序中使用Async-await方法异步请求变为同步请求方法
Mar 28 #Javascript
详解Js里的for…in和for…of的用法
Mar 28 #Javascript
ES7之Async/await的使用详解
Mar 28 #Javascript
详解vue-cli3多环境打包配置
Mar 28 #Javascript
微信小程序之onLaunch与onload异步问题详解
Mar 28 #Javascript
详解vue使用插槽分发内容slot的用法
Mar 28 #Javascript
You might like
给多个地址发邮件的类
2006/10/09 PHP
PHP基于GD库实现的生成图片缩略图函数示例
2017/07/05 PHP
asp.net+js 实现无刷新上传解析csv文件的代码
2010/05/17 Javascript
JavaScript简介
2015/02/15 Javascript
jQuery三级下拉列表导航菜单代码分享
2020/04/15 Javascript
jQuery动态添加可拖动元素完整实例(附demo源码下载)
2016/06/21 Javascript
jQuery制作网页版选项卡
2016/07/28 Javascript
深入理解jQuery layui分页控件的使用
2016/08/17 Javascript
js防阻塞加载的实现方法
2016/09/09 Javascript
Javascript数组循环遍历之forEach详解
2016/11/07 Javascript
快速入门Vue
2016/12/19 Javascript
从零学习node.js之利用express搭建简易论坛(七)
2017/02/25 Javascript
JavaScript学习总结之正则的元字符和一些简单的应用
2017/06/30 Javascript
echarts同一页面中四个图表切换的js数据交互方法示例
2018/07/03 Javascript
jQuery插件实现的日历功能示例【附源码下载】
2018/09/07 jQuery
eslint 的三大通用规则详解
2019/05/16 Javascript
vue 设置 input 为不可以编辑的实现方法
2019/09/19 Javascript
Element Rate 评分的使用方法
2020/07/27 Javascript
解决vue-router路由拦截造成死循环问题
2020/08/05 Javascript
[15:56]Heroes18_暗影萨满(完美)
2014/10/31 DOTA
Python的socket模块源码中的一些实现要点分析
2016/06/06 Python
Python温度转换实例分析
2018/01/17 Python
最小二乘法及其python实现详解
2020/02/24 Python
Django接收照片储存文件的实例代码
2020/03/07 Python
基于Python实现天天酷跑功能
2021/01/06 Python
CSS3 绘制BMW logo实的现代码
2013/04/25 HTML / CSS
荷兰手表网站:Watch2Day
2018/07/02 全球购物
澳大利亚买卖正宗二手奢侈品交易平台:Luxe.It.Fwd
2019/10/16 全球购物
致跳高运动员加油稿
2014/02/12 职场文书
小学班主任寄语大全
2014/04/04 职场文书
态度决定一切演讲稿
2014/05/20 职场文书
出差报告怎么写
2014/11/06 职场文书
2015年爱牙日活动总结
2015/02/05 职场文书
劳动仲裁撤诉申请书
2015/05/18 职场文书
NodeJs内存占用过高的排查实战记录
2021/05/10 NodeJs
在python中读取和写入CSV文件详情
2022/06/28 Python