JavaScript闭包相关知识解析


Posted in Javascript onOctober 19, 2019

闭包是JavaScript中的一个难点,同时也是它的特色,JavaScript的很多高级应用都要依靠闭包来实现。以下是我学习闭包的记录,希望对你有些帮助。

变量作用域

在学习闭包之前,我们首先要理解JavaScript不同与其他语言独特的变量作用域。在JavaScript中,不存在局部作用域的概念,但是有全局作用域以及函数作用域。全局作用域与其他语言的相同,没有需要注意的地方,而函数作用域是指函数内部声明的变量在函数外部无法直接访问。

var a = 99;
function f1() {
  console.log(a);
}
f1();

上面的代码中,f1可以读取到全局变量a,而下面的代码中a无法被访问。

function f1() {
  var a = 99;
}
console.log(a);

如何从外部读取函数内部声明的变量?

在某些情况下,我们可能需要得到函数内部的变量,正常情况下是无法做到的,因此需要用特殊的办法。

function f1() {
  var a = 99;
  function f2() {
    console.log(a);
  }
}

上面代码中,我们在函数f1中定义另一个函数f2,这样f1中的所有变量对于f2来说就是可见的,既然f2可以读取到f1中的变量,那么我们只要把f2作为f1的返回值,我们就可以在f1的外部读取到它内部的变量了。

function f1() {
  var a = 99;
  function f2() {
    console.log(a);
  }
  return f2;
}
var result = f1();
result();

此时,就形成了一个简单的闭包。因此,闭包就可以简单的理解为函数中的函数,而本质上,闭包就是一个连接函数内部和外部的桥梁。

闭包的特性

闭包会使得函数中的变量都被保存到内存中。首先我们先看一下以下两个例子

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

count是函数A中的一个变量,它的值在函数B中被改变,函数B每执行一次,count的值就在原来的基础上累加1,因此,函数A中的count变量会一直保存在内存中。

function A(x) {
  function B(y) {
    console.log(x+y);
  }
return B;
}
var C = A(3);
C(5); //8

当3传入A函数后,B函数就会记住这个值,所以在后面传入5的时候只会对B函数中的y赋值,所以最后会输出8。

使用闭包的注意点

由于上述闭包的特性,每次使用闭包都会大量增加内存的消耗,所以不能滥用闭包,否则会影响网页的性能。我们也可以在函数退出前,使函数内变量指向null来手动删除变量。我们可以来看下一道经典的面试题来理解。

function outer(){
  var num = 0; //内部变量
  return function add() { //通过return返回add函数,就可以在outer函数外访问了
    num++; //内部函数有引用,作为add函数的一部分了
    console.log(num);
  };
}
var func1 = outer();
func1(); //实际上是调用add函数, 输出1
func1(); //输出2 因为outer函数内部的私有作用域会一直被占用
var func2 = outer();
func2(); // 输出1 每次重新引用函数的时候,闭包是全新的。
func2(); // 输出2

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
纯js实现的论坛常用的运行代码的效果
Jul 15 Javascript
基于jQuery的输入框在光标位置插入内容, 并选中
Oct 29 Javascript
JavaScript 用Node.js写Shell脚本[译]
Sep 20 Javascript
JavaScript中使用Substring删除字符串最后一个字符
Nov 03 Javascript
JS动态调用方法名示例介绍
Dec 18 Javascript
jQuery学习笔记之 Ajax操作篇(一) - 数据加载
Jun 23 Javascript
jQuery实现鼠标经过弹出提示信息的地图热点效果
Aug 07 Javascript
前端设计师们最常用的JS代码汇总
Sep 25 Javascript
Jquery循环截取字符串的方法(多出的字符串处理成"...")
Nov 28 Javascript
Vue自定义图片懒加载指令v-lazyload详解
Dec 31 Javascript
通过vue-router懒加载解决首次加载时资源过多导致的速度缓慢问题
Apr 08 Javascript
微信小程序之数据绑定原理解析
Aug 14 Javascript
Vue.js组件通信之自定义事件详解
Oct 19 #Javascript
Vue.js自定义指令学习使用详解
Oct 19 #Javascript
Vue.js标签页组件使用方法详解
Oct 19 #Javascript
基于JavaScript获取base64图片大小
Oct 18 #Javascript
react MPA 多页配置详解
Oct 18 #Javascript
vue滚动插件better-scroll使用详解
Oct 18 #Javascript
VUE实现密码验证与提示功能
Oct 18 #Javascript
You might like
安健A254立体声随身听的分析与打磨
2021/03/02 无线电
玩转虚拟域名◎+ .
2006/10/09 PHP
phpmyadmin MySQL 加密配置方法
2009/07/05 PHP
PHP simple_html_dom.php+正则 采集文章代码
2009/12/24 PHP
基于jquery的获取浏览器窗口大小的代码
2011/03/28 Javascript
合并table相同单元格的jquery插件分享(很精简)
2011/06/20 Javascript
NodeJS框架Express的模板视图机制分析
2011/07/19 NodeJs
Javascript对象Clone实例分析
2015/06/09 Javascript
vue,angular,avalon这三种MVVM框架优缺点
2016/04/27 Javascript
如何用JavaScript实现动态修改CSS样式表
2016/05/20 Javascript
微信小程序  checkbox组件详解及简单实例
2017/01/10 Javascript
jquery表单插件form使用方法详解
2017/01/20 Javascript
JS条形码(一维码)插件JsBarcode用法详解【编码类型、参数、属性】
2017/04/19 Javascript
vue实现仿淘宝结账页面实例代码
2017/11/08 Javascript
15个顶级开源JavaScript框架和库
2018/10/10 Javascript
[01:20:37]FNATIC vs NIP 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
Python自动发邮件脚本
2017/03/31 Python
轻松理解Python 中的 descriptor
2017/09/15 Python
Python编程pygal绘图实例之XY线
2017/12/09 Python
Python输出各行命令详解
2018/02/01 Python
Python之dict(或对象)与json之间的互相转化实例
2018/06/05 Python
如何安装多版本python python2和python3共存以及pip共存
2018/09/18 Python
selenium设置proxy、headers的方法(phantomjs、Chrome、Firefox)
2018/11/29 Python
Python提取频域特征知识点浅析
2019/03/04 Python
TensorFlow-gpu和opencv安装详细教程
2020/06/30 Python
python如何写个俄罗斯方块
2020/11/06 Python
Python tkinter实现日期选择器
2021/02/22 Python
css3实现波纹特效、H5实现动态波浪效果
2018/01/31 HTML / CSS
使用 css3 transform 属性来变换背景图的方法
2019/05/07 HTML / CSS
Html5新标签datalist实现输入框与后台数据库数据的动态匹配
2017/05/18 HTML / CSS
成人教育自我鉴定
2013/11/01 职场文书
村捐赠仪式答谢词
2014/01/21 职场文书
旅游个人求职信范文
2014/01/30 职场文书
毕业生就业推荐表自我鉴定
2014/03/20 职场文书
2015年学校工作总结范文
2015/04/20 职场文书
这样写python注释让代码更加的优雅
2021/06/02 Python