浅谈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 相关文章推荐
json 定义
Jun 10 Javascript
JS 显示当前日期与时间的代码
Mar 24 Javascript
文本框获得焦点和失去焦点的判断代码
Mar 18 Javascript
js sort 二维数组排序的用法小结
Jan 24 Javascript
JS实现DIV容器赋值的方法
Dec 14 Javascript
JS添加或修改控件的样式(Class)实现方法
Oct 15 Javascript
自己封装的一个原生JS拖动方法(推荐)
Nov 22 Javascript
Angular2 自定义validators的实现方法
Jul 05 Javascript
JavaScript实现单例模式实例分享
Dec 22 Javascript
关于jquery layui弹出层的使用方法
Apr 21 jQuery
vue2.0移动端滑动事件vue-touch的实例代码
Nov 27 Javascript
jQuery实现的网站banner图片无缝轮播效果完整实例
Jan 28 jQuery
微信小程序中转义字符的处理方法
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
ThinkPHP表单自动提交验证实例教程
2014/07/18 PHP
php计算数组相同值出现次数的代码(array_count_values)
2015/01/20 PHP
PHP生成及获取JSON文件的方法
2016/08/23 PHP
php使用gd2绘制基本图形示例(直线、圆、正方形)
2017/02/15 PHP
Sample script that displays all of the users in a given SQL Server DB
2007/06/16 Javascript
使用jQuery的ajax功能实现的RSS Reader 代码
2009/09/03 Javascript
JS、CSS加载中的小问题探讨
2013/11/26 Javascript
基于jQuery日历插件制作日历
2016/03/11 Javascript
javascript淘宝主图放大镜功能
2016/10/20 Javascript
12条写出高质量JS代码的方法
2018/01/07 Javascript
浅谈Koa2框架利用CORS完成跨域ajax请求
2018/03/06 Javascript
Vue 获取数组键名的方法
2018/06/21 Javascript
微信小程序实现自动定位功能
2018/10/31 Javascript
pm2启动ssr失败的解决方法
2019/06/29 Javascript
vant-ui组件调用Dialog弹窗异步关闭操作
2020/11/04 Javascript
利用 Chrome Dev Tools 进行页面性能分析的步骤说明(前端性能优化)
2021/02/24 Javascript
[56:17]NB vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第三场 8.22
2019/09/05 DOTA
值得收藏,Python 开发中的高级技巧
2018/11/23 Python
python调用matplotlib模块绘制柱状图
2019/10/18 Python
基于python3生成标签云代码解析
2020/02/18 Python
Python稀疏矩阵及参数保存代码实现
2020/04/18 Python
python 获取字典特定值对应的键的实现
2020/09/29 Python
收集的7个CSS3代码生成工具
2010/04/17 HTML / CSS
css3实例教程 一款纯css3实现的发光屏幕旋转特效
2014/12/07 HTML / CSS
html5小技巧之通过document.head获取head元素
2014/06/04 HTML / CSS
FORZIERI澳大利亚站:全球顶级奢华配饰精品店
2016/12/31 全球购物
英国和爱尔兰的自炊式豪华度假小屋:Rural Retreats
2018/06/08 全球购物
abstract是什么意思
2012/02/12 面试题
Prototype如何为一个Ajax添加一个参数
2015/12/06 面试题
《新型玻璃》教学反思
2014/04/13 职场文书
十佳文明家庭事迹
2014/05/25 职场文书
幼儿园标语大全
2014/06/19 职场文书
英文版辞职信
2015/02/28 职场文书
四则混合运算教学反思
2016/02/23 职场文书
Python入门之使用pandas分析excel数据
2021/05/12 Python
Python实现天气查询软件
2021/06/07 Python