浅谈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 相关文章推荐
jQuery 瀑布流 绝对定位布局(二)(延迟AJAX加载图片)
May 23 Javascript
jQuery后代选择器用法实例
Dec 23 Javascript
js匿名函数作为函数参数详解
Jun 01 Javascript
Bootstrap登陆注册页面开发教程
Jul 12 Javascript
十大 Node.js 的 Web 框架(快速提升工作效率)
Jun 30 Javascript
jQuery修改DOM结构_动力节点Java学院整理
Jul 05 jQuery
jQuery中库的引用方法
Jan 06 jQuery
微信小程序实现星级评分和展示
Jul 05 Javascript
前端防止用户重复提交js实现代码示例
Sep 07 Javascript
jquery 动态遍历select 赋值的实例
Sep 12 jQuery
利用angular自动编译andriod APK的绕坑经历分享
Mar 08 Javascript
JS定义函数的几种常用方法小结
May 23 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
台湾中原大学php教程孙仲岳主讲
2008/01/07 PHP
php中将地址生成迅雷快车旋风链接的代码[测试通过]
2011/04/20 PHP
PHP中判断变量为空的几种方法小结
2013/11/12 PHP
PHP用反撇号执行外部命令
2015/04/14 PHP
php实现微信公众平台账号自定义菜单类
2015/10/11 PHP
PHP API接口必备之输出json格式数据示例代码
2017/06/27 PHP
laravel框架查询数据集转为数组的两种方法
2019/10/10 PHP
Thinkphp5框架中引入Markdown编辑器操作示例
2020/06/03 PHP
js 多浏览器分别判断代码
2010/04/01 Javascript
document.getElementById方法在Firefox与IE中的区别
2010/05/18 Javascript
判断用户是否在线的代码
2011/03/05 Javascript
回车直接实现点击某按钮的效果即触发单击事件
2014/02/27 Javascript
使用jquery prev()方法找到同级的前一个元素
2014/07/11 Javascript
AngularJS基础 ng-srcset 指令简单示例
2016/08/03 Javascript
AngularJS入门教程之过滤器详解
2016/08/19 Javascript
Bootstrap实现渐变顶部固定自适应导航栏
2020/08/27 Javascript
基于Koa2写个脚手架模拟接口服务的方法
2018/11/27 Javascript
前端插件之Bootstrap Dual Listbox使用教程
2019/07/23 Javascript
小程序自定义导航栏兼容适配所有机型(附完整案例)
2020/04/26 Javascript
[43:26]完美世界DOTA2联赛PWL S2 Forest vs Rebirth 第二场 11.20
2020/11/23 DOTA
详解Python的collections模块中的deque双端队列结构
2016/07/07 Python
python 剪切移动文件的实现代码
2018/08/02 Python
用Django写天气预报查询网站
2018/10/21 Python
pymysql模块的使用(增删改查)详解
2019/09/09 Python
CSS3中31种选择器使用方法教程
2013/12/05 HTML / CSS
七年级历史教学反思
2014/02/05 职场文书
大学生创业项目方案
2014/03/08 职场文书
竞选劳动委员演讲稿
2014/04/28 职场文书
ktv筹备计划书
2014/05/03 职场文书
关于责任的演讲稿
2014/05/20 职场文书
离婚协议书怎么写
2015/01/26 职场文书
忆童年!用Python实现愤怒的小鸟游戏
2021/06/07 Python
关于JavaScript回调函数的深入理解
2021/06/27 Javascript
Python socket如何解析HTTP请求内容
2022/02/12 Python
Mysql Innodb存储引擎之索引与算法
2022/02/15 MySQL
纯CSS实现一个简单步骤条的示例代码
2022/07/15 HTML / CSS