博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
深入理解 Javascript 之 闭包
阅读量:6325 次
发布时间:2019-06-22

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

闭包

图片描述

一、认识闭包

闭包是一种特殊的对象。它由两部分构成:函数,以及创建该函数的环境(包含自由变量)。环境由闭包创建时在作用域中的任何局部变量组成。

二、闭包的产生

function f() {  var a = 2;  var b = 3;  function g(){    console.log(a);  }    g();}f();

这就形成了一个闭包,函数g以及其所在的环境以及其中的自由变量就组成了一个闭包。

创建闭包最常见方式,就是在一个函数内部创建另一个函数。下面例子中的 closure 也是一个闭包:

function func(){  var a = 1,b = 2;    function closure(){    return a+b;  }  return closure;}

下面也是一个闭包

function f1() {  var a = 10;  var b = 20;  return function g() {    console.log(a);  }}var result = f1;result()(); // 10

三、闭包的好处

实例 1 累加 【减少全局变量个数】

function add () {  var a  = 0;  return function () {    a++;    alert(a);  }}var result = add();result(); // 1result(); // 2

实例 2 【减少传递参数的个数】

function callFac(base) {  return function (max) {    var total = 0;    for(var i = 1; i <= max; i++) {      total+=i;    }    return total + base;  }}var result = callFac(2);result(3); // 8

实例 2 【封装】

(function () {  var a = 0;  function getM() {    rerurn a;  }  function setM(val) {    a = val;  }  window.g = getM;  window.s = setM;})();s(3);

三、闭包的注意点

1、 对捕获的变量只是个引用,不是复制

function f() {  var num = 0;  function g () {    alert(num); // 这里使用的是引用  }  num ++;  g(); // 在调用执行之前就已经加 1了} f();

2、每调用一次父函数,就会产生一个新的闭包

function f() {  var num = 1;  return function () {    num++;    alert(num);  }}var result1 = f();result1(); // 2result1(); // 3var result2 = f();result2(); // 2result2(); // 3

3. 循环

  • 1
  • 2
  • 3
// 结果是无论点击那个,都是弹出4
// 解决办法
  • 1
  • 2
  • 3

转载地址:http://dtmaa.baihongyu.com/

你可能感兴趣的文章
数据库连接池dataesoruce pool深入理解
查看>>
vuejs2.0使用Sortable.js实现的拖拽功能
查看>>
oracle多实例的启动与关闭
查看>>
码农生涯杂记_4
查看>>
利用jQuery设计横/纵向菜单
查看>>
unity游戏开发之NGUI的UISprite染色
查看>>
HDOJ find the safest road 1596【最短路变形】
查看>>
高度决定视野眼界决定世界
查看>>
shell脚本路径写法的注意点
查看>>
Testng生成的测试报告乱码解决办法
查看>>
vim快速入门
查看>>
大杂烩 -- 单向链表是否存在环或是否相交
查看>>
关键字检索高亮标出-javasript/jQuery代码实现
查看>>
Vijos P1785 同学排序【模拟】
查看>>
人物关系网络图可视化
查看>>
关于ADO.Net SqlConnection的性能优化
查看>>
docker安装及加速配置
查看>>
MRF能量优化
查看>>
什么是.Net, IL, CLI, BCL, FCL, CTS, CLS, CLR, JIT
查看>>
Atlas Control ToolKit 发布
查看>>