浅谈js闭包理解


Posted in Javascript onApril 01, 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 相关文章推荐
document对象execCommand的command参数介绍
Aug 01 Javascript
JavaScript高级程序设计 阅读笔记(十三) js定义类或对象
Aug 14 Javascript
javascript eval(func())使用示例
Dec 05 Javascript
JavaScript AJAX之惰性载入函数
Aug 27 Javascript
node.js中module.exports与exports用法上的区别
Sep 02 Javascript
详解jQuery事件
Jan 13 Javascript
JS实现动态给标签控件添加事件的方法示例
May 13 Javascript
详解node Async/Await 更好的异步编程解决方案
May 10 Javascript
初探Vue3.0 中的一大亮点Proxy的使用
Dec 06 Javascript
JS前端知识点 运算符优先级,URL编码与解码,String,Math,arguments操作整理总结
Jun 27 Javascript
非常实用的jQuery代码段集锦【检测浏览器、滚动、复制、淡入淡出等】
Aug 08 jQuery
浅谈vue 多个变量同时赋相同值互相影响
Aug 05 Javascript
详解Vue之父子组件传值
Apr 01 #Javascript
微信二次分享报错invalid signature问题及解决方法
Apr 01 #Javascript
JS中的防抖与节流及作用详解
Apr 01 #Javascript
微信小程序 slot踩坑的解决
Apr 01 #Javascript
浅谈Vue.js 关于页面加载完成后执行一个方法的问题
Apr 01 #Javascript
VUE脚手架的下载和配置步骤详解
Apr 01 #Javascript
详解JavaScript中的函数、对象
Apr 01 #Javascript
You might like
ThinkPHP3.1新特性之对Ajax的支持更加完善
2014/06/19 PHP
PHP+AJAX实现投票功能的方法
2015/09/28 PHP
WordPress中给媒体文件添加分类和标签的PHP功能实现
2015/12/31 PHP
php使用socket调用http和smtp协议实例小结
2019/07/26 PHP
网页编辑器ckeditor和ckfinder配置步骤分享
2012/05/24 Javascript
jquery仿QQ商城带左右按钮控制焦点图片切换滚动效果
2013/06/27 Javascript
JavaScript中window、doucment、body的解释
2013/08/14 Javascript
网页中可关闭的漂浮窗口实现可自行调节
2013/08/20 Javascript
完美兼容各大浏览器的jQuery仿新浪图文淡入淡出间歇滚动特效
2014/11/12 Javascript
vue.js指令v-model实现方法
2016/12/05 Javascript
ES6学习教程之对象的扩展详解
2017/05/02 Javascript
Vue表单类的父子组件数据传递示例
2018/05/03 Javascript
解决echarts图表使用v-show控制图表显示不全的问题
2020/07/19 Javascript
解决echarts vue数据更新,视图不更新问题(echarts嵌在vue弹框中)
2020/07/20 Javascript
详解React中共享组件逻辑的三种方式
2021/02/02 Javascript
简单介绍Python中的JSON使用
2015/04/28 Python
python使用jieba实现中文分词去停用词方法示例
2018/03/11 Python
使用PyQtGraph绘制精美的股票行情K线图的示例代码
2019/03/14 Python
python腾讯语音合成实现过程解析
2019/08/01 Python
Pycharm使用远程linux服务器conda/python环境在本地运行的方法(图解))
2019/12/09 Python
利用CSS3实现文本框的清除按钮相关的一些效果
2015/06/23 HTML / CSS
详解webapp页面滚动卡顿的解决办法
2018/12/26 HTML / CSS
苹果中国官方网站:Apple中国
2016/07/22 全球购物
阿拉伯时尚购物网站:Nisnass
2021/02/07 全球购物
七年级音乐教学反思
2014/01/26 职场文书
文明礼貌演讲稿
2014/05/12 职场文书
2014乡镇干部纪律作风整顿思想汇报
2014/09/13 职场文书
岗位竞聘报告范文
2014/11/06 职场文书
安全员岗位职责范本
2015/04/11 职场文书
前台接待员岗位职责
2015/04/15 职场文书
实习感想范文
2015/08/10 职场文书
公司借款担保书
2015/09/22 职场文书
队列队形口号
2015/12/25 职场文书
党员廉政准则心得体会
2016/01/20 职场文书
小学运动会开幕词
2016/03/04 职场文书
pytorch显存一直变大的解决方案
2021/04/08 Python