博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
js闭包
阅读量:4341 次
发布时间:2019-06-07

本文共 934 字,大约阅读时间需要 3 分钟。

闭包是可访问上一层函数作用域里变量的函数,即便上一层函数已经关闭

通俗点讲,闭包就是一个函数引用另一个函数的变量,因为变量被引用着所以不会被回收,因此可以用来封装一个私有变量。这是优点也是缺点,不必要的闭包只会增加内存消耗。

为什么要用闭包?

function a() {    var num = 0;    console.log(++num);}a(); // 1a(); // 1

上面的代码输出了两次1,这是因为函数执行完以后,里面的变量(即局部变量)就会销毁,下一次运行又会重新创建那个变量,所以虽然第一次++num了,但是这个变量在第一次执行完毕以后就会被销毁了。

如何确保第一次的变量不被销毁,这时就要用到闭包了。

js中有垃圾回收机制,函数没有被引用,执行完以后这个函数的作用域就会被销毁,如果一个函数被其他变量引用,这个函数的作用域将不会被销毁。(简单来说,就是函数里面的变量会被保存下来,可以理解为全局变量。)

列举两个闭包写法:

function A() {    var aa = 0;    function B() {        aa++;        console.log(aa);    }    return B;}var C = A();C(); // 1C(); // 2

总结上面代码的步骤是:

  1. 定义普通函数A
  2. 在A中定义普通函数B
  3. 在A中返回B
  4. 执行A,并把A的返回结果赋值给变量C
  5. 执行C
    以上总结成一句话就是:
    函数A的内部函数B被函数A外的一个变量C引用
    再加工一下就成了闭包的定义:
    当一个内部函数被其外部函数之外的变量引用时,就形成了一个闭包。

另一个更常见的闭包写法

var bi = (function() {    var a = 0;    function b() {        a++;        console.log(a);    }    return b;})();bi(); // 1bi(); // 2bi(); // 3

摘抄部分追梦子博客(更多详细内容如下网址):

转载于:https://www.cnblogs.com/miacara94/p/9087472.html

你可能感兴趣的文章
CRC码计算及校验原理的最通俗诠释
查看>>
使用Gitbook来编写你的Api文档
查看>>
jquery扩展 $.fn
查看>>
Markdown指南
查看>>
influxDB的安装和简单使用
查看>>
JPA框架学习
查看>>
JPA、JTA、XA相关索引
查看>>
机器分配
查看>>
php opcode缓存
查看>>
springcloud之Feign、ribbon设置超时时间和重试机制的总结
查看>>
观看杨老师(杨旭)Asp.Net Core MVC入门教程记录
查看>>
UIDynamic(物理仿真)
查看>>
Windows下安装Redis
查看>>
winform非常实用的程序退出方法!!!!!(转自博客园)
查看>>
centos安装vim
查看>>
linux工作调度(计划任务)
查看>>
新部署到服务器 报 The requested URL /home/profession was not found on this server. 错误
查看>>
hadoop从非HA转到NAMENODE HA时需要注意的一个问题
查看>>
KnockoutJs学习笔记(十一)
查看>>
访问修饰符public、private、protect、default范围
查看>>