浅谈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 相关文章推荐
lyhucSelect基于Jquery的Select数据联动插件
Mar 29 Javascript
js FLASH幻灯片字符串中有连接符&的处理方法
Mar 01 Javascript
浅谈javascript回调函数
Dec 07 Javascript
node.js中的http.response.setHeader方法使用说明
Dec 14 Javascript
JavaScript面向对象编写购物车功能
Aug 19 Javascript
微信小程序小组件 基于Canvas实现直播点赞气泡效果
May 29 Javascript
vue利用axios来完成数据的交互
Mar 23 Javascript
Vue 中的受控与非受控组件的实现
Dec 17 Javascript
Vuejs学习笔记之使用指令v-model完成表单的数据双向绑定
Apr 29 Javascript
Js逆向实现滑动验证码图片还原的示例代码
Mar 10 Javascript
javascript 设计模式之享元模式原理与应用详解
Apr 08 Javascript
三种方式清除vue路由跳转router-link的历史记录
Apr 10 Vue.js
详解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
php环境配置 php5 mysql5 apache2 phpmyadmin安装与配置
2006/11/17 PHP
Linux下ZendOptimizer的安装与配置方法
2007/04/12 PHP
PHP实现的MongoDB数据库操作类分享
2014/05/12 PHP
简要剖析PHP的Yii框架的组件化机制的基本知识
2016/03/17 PHP
PHP中strtr与str_replace函数运行性能简单测试示例
2019/06/22 PHP
laravel框架使用阿里云短信发送消息操作示例
2020/02/15 PHP
jQuery控制Div拖拽效果完整实例分析
2015/04/15 Javascript
原生JavaScript实现AJAX、JSONP
2017/02/07 Javascript
Vue.js学习笔记之常用模板语法详解
2017/07/25 Javascript
Vue2.0如何发布项目实战
2017/07/27 Javascript
JavaScript截屏功能的实现代码
2017/07/28 Javascript
javascript按顺序加载运行js方法
2017/12/01 Javascript
浅谈Vue数据绑定的原理
2018/01/08 Javascript
Vue props用法详解(小结)
2018/07/03 Javascript
vue实现的双向数据绑定操作示例
2018/12/04 Javascript
改进 JavaScript 和 Rust 的互操作性并深入认识 wasm-bindgen 组件
2019/07/13 Javascript
Django中几种重定向方法
2015/04/28 Python
python数组复制拷贝的实现方法
2015/06/09 Python
Python编程入门之Hello World的三种实现方式
2015/11/13 Python
Python 错误和异常代码详解
2018/01/29 Python
详解Python函数式编程—高阶函数
2019/03/29 Python
Django框架会话技术实例分析【Cookie与Session】
2019/05/24 Python
Python timeit模块的使用实践
2020/01/13 Python
python matplotlib绘制三维图的示例
2020/09/24 Python
利用canvas实现图片压缩的示例代码
2018/07/17 HTML / CSS
Rosetta Stone官方网站:语言学习
2019/01/05 全球购物
Java基础面试题
2014/07/19 面试题
车间班组长岗位职责
2013/11/13 职场文书
迟到检讨书5000字
2014/01/31 职场文书
幼儿教师国培感言
2014/02/19 职场文书
2014年最新领导班子整改方案
2014/09/27 职场文书
乡镇党员干部群众路线对照检查材料思想汇报
2014/09/28 职场文书
婚礼伴郎致辞
2015/07/28 职场文书
恶魔之树最顶端的三颗果实 震震果实上榜,第一可以制造岩浆
2022/03/18 日漫
进阶篇之linux环境下安装MySQL数据库
2022/04/09 MySQL
MySQL 计算连续登录天数
2022/05/11 MySQL