浅谈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 相关文章推荐
javascript document.compatMode兼容性
Feb 23 Javascript
jQuery中setTimeout的几种使用方法小结
Apr 07 Javascript
查看图片(前进后退)功能实现js代码
Apr 24 Javascript
jquery异步跨域访问代码
Jun 28 Javascript
jquery提交form表单简单示例分享
Mar 03 Javascript
JavaScript学习心得之概述
Jan 20 Javascript
JavaScript简单判断复选框是否选中及取出值的方法
Aug 13 Javascript
js实现的鼠标滚轮滚动切换页面效果(类似360默认页面滚动切换效果)
Jan 27 Javascript
EditPlus 正则表达式 实战(3)
Dec 15 Javascript
canvas绘制万花筒效果(代码分享)
Jan 20 Javascript
JS实现的计数排序与基数排序算法示例
Dec 04 Javascript
vue实现百度下拉列表交互操作示例
Mar 12 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
详解WordPress开发中用于获取分类及子页面的函数用法
2016/01/08 PHP
基于thinkPHP框架实现留言板的方法
2016/10/17 PHP
PHP多个图片压缩成ZIP的方法
2020/08/18 PHP
一个对于js this关键字的问题
2007/01/09 Javascript
jQuery中json对象的复制方式介绍(数组及对象)
2013/06/08 Javascript
jquery如何通过name名称获取当前name的value值
2013/12/20 Javascript
通过location.replace禁止浏览器后退防止重复提交
2014/09/04 Javascript
关于JavaScript 原型链的一点个人理解
2016/07/31 Javascript
JavaScript实现垂直向上无缝滚动特效代码
2016/11/23 Javascript
bootstrap学习使用(导航条、下拉菜单、轮播、栅格布局等)
2016/12/01 Javascript
vue2.0开发实践总结之入门篇
2016/12/06 Javascript
js仿搜狐视频记录片列表展示效果
2020/05/30 Javascript
vue实现登录后页面跳转到之前页面
2018/01/07 Javascript
p5.js实现斐波那契螺旋的示例代码
2018/03/22 Javascript
浅析Vue.js中v-bind v-model的使用和区别
2018/12/04 Javascript
JavaScript实现横版菜单栏
2020/03/17 Javascript
JavaScript console的使用方法实例分析
2020/04/28 Javascript
使用Python获取Linux系统的各种信息
2014/07/10 Python
Python 搭建Web站点之Web服务器网关接口
2016/11/06 Python
Python实现Linux的find命令实例分享
2017/06/04 Python
Python实现监控Nginx配置文件的不同并发送邮件报警功能示例
2019/02/26 Python
Django中celery执行任务结果的保存方法
2019/07/12 Python
基于Python实现剪切板实时监控方法解析
2019/09/11 Python
python开根号实例讲解
2020/08/30 Python
详解使用Python写一个向数据库填充数据的小工具(推荐)
2020/09/11 Python
美国领先的汽车轮胎和轮毂供应商:TireBuyer
2016/07/21 全球购物
中海讯通笔试题
2015/09/15 面试题
保安拾金不昧表扬信
2014/01/15 职场文书
搞笑获奖感言
2014/01/30 职场文书
关于运动会广播稿200字
2014/10/08 职场文书
高考作弊检讨书1500字
2015/02/16 职场文书
个人工作决心书
2015/09/22 职场文书
如何使用vue3打造一个物料库
2021/05/08 Vue.js
vue基于Teleport实现Modal组件
2021/05/31 Vue.js
python的netCDF4批量处理NC格式文件的操作方法
2022/03/21 Python
HTML5基础学习之文本标签控制
2022/03/25 HTML / CSS