函数的声明与执行

  • 函数定义阶段
    1.会在堆内存中开辟一个存储空间 把函数体放在这个空间里 函数中的所有变量不解析
    2.把这个空间地址赋值给函数名 然后储存在栈内存中

  • 函数调用阶段
    1.根据函数名找到对应的函数存储空间
    2.然后再堆内存中再开辟一个函数执行空间
    3.在这个执行空间里面进行函数赋值 和与解析
    4.这时函数储存空间的代码会复制到函数执行空间内 然后执行
    5.执行完毕之后 执行空间销毁
    函数每次执行都会开辟一个执行空间 执行完毕后 执行空间销毁 这个过程也就是所说的垃圾回收机制

  • 函数执行的特殊情况
    当函数返回的是一个复杂数据类型时 并且在函数的外部有变量接收这个复杂数据类型
    只有这个外部变量不在引用函数内部返回值的时候 这个函数执行空间才会销毁
    那么闭包就是利用函数的这个特性来实现的 接下来聊一聊js的闭包

闭包

  • 理解闭包的含义
    闭包形成的三要素:
    1.在函数A内部直接或者间接返回一个函数B
    2.B函数内有A函数的私有变量
    3.A函数的外部有一个变量接收这返回的B函数

  • 闭包空间

当A函数执行完毕后 销毁并且在A函数的内部有一个B函数的存储空间 这个空间就叫做闭包空间

  • 形成闭包的代码结构
function fn(){var  num = 1;return function b(){console.log(num)}
}
var f = fn();
f()//1
  • 闭包的作用
    1.可以做缓存
function version() {var food = '';var obj = {eat : function(){console.log('我正在吃'+food);food = "";},abb : function (myFood){food = myFood;}}return obj;
}
var eater = version();
eater.abb('apple');
eater.eat();//我正在吃apple

2.实现公有变量
函数累加器

function add(){varcount = 0;function demo(){count++;console.log(count);}return demo;
}
var counter = add();
//每次调用一次就会在原有基础上加一;
counter();
counter();
counter();

3.模块化开发防止污染全局变量

function test(){var arr = [];for(var i = 0;i<10;i++){(function(j){arr[j]=function(){console.log(j+",");}})(i)}return arr;
}
var myArr = test();
for (var j = 0 ; j < 10 ; j++){myArr[j]();
}
//打印0,1,2,3,4,5,6,7,8,9
  • 闭包的缺点
    当内部函数被保存到外部时就会生成闭包 闭包会导致原有作用域链不释放 造成能存泄露

闭包的应用场景

<!DOCTYPE html>
<html><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><title></title><link rel="stylesheet" href="">
</head><body><p>hello world</p><button>12</button><button>14</button><button>16</button><script>document.querySelectorAll('button')[0].onclick = changeSize(12);document.querySelectorAll('button')[1].onclick = changeSize(14);document.querySelectorAll('button')[2].onclick = changeSize(16);function changeSize(size) {return function () {document.body.style.fontSize = size + 'px';};}//我们定义行为,然后把它关联到某个用户事件上(点击或者按键)。我们的代码通常会作为一个回调(事件触发时调用的函数)绑定到事件上</script>
</body></html>

循环绑定事件

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Document</title>
</head><body><button>1</button><button>2</button><button>3</button><button>4</button><script>var btns = document.querySelectorAll('button')for (var i = 0; i < btns.length; i++) {(function loop(num) {btns[num].onclick = function () {console.log(num)}})(i)}</script>
</body></html>

js闭包的理解及应用场景相关推荐

  1. JS闭包的理解及常见应用场景

    JS闭包的理解及常见应用场景 一.总结 一句话总结: 闭包是指有权访问另一个函数作用域中的变量的函数 1.如何从外部读取函数内部的变量,为什么? 闭包:f2可以读取f1中的变量,只要把f2作为返回值, ...

  2. 面试官:谈谈对JS闭包的理解及常见应用场景(闭包的作用)

    文章目录 对JS闭包的理解及常见应用场景(闭包的作用) 1.变量作用域 2.如何从外部读取函数内部的变量? 3.闭包概念 4.闭包用途 5.闭包的理解 6.闭包应用场景 setTimeout传参 回调 ...

  3. 浅谈对js闭包的理解

    闭包就是能够读取其他函数内部变量的函数.由于在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成"定义在一个函数内部的函数".在本质上,闭包是将函数内 ...

  4. 谈一谈对JS闭包的理解

    个人觉得理解闭包,首先要理解以下几个概念. 1.函数的作用域和作用域链 js不像java等其他类语言,它并不存在块级作用域,取而代之的是函数作用域,另一个变量作用域是全局作用域. 函数的作用域:变量在 ...

  5. js闭包的理解和作用

    一.为什么引入闭包 JS为每个变量对象定了作用域,在ES5 中只有全局作用域和函数作用域,没有块级作用域,由内向外形成作用域链,函数外部不能访问函数内部作用域的局部变量.在实际开发中会带来很多不便. ...

  6. js闭包是什么?对js闭包的理解

    结合 MDN 官网中 JavaScript 章节中对闭包详解,我们需要理清的问题有,什么是闭包.闭包产生的条件.以及闭包的用途. 1.1 闭包的概念 闭包(closure)是一个函数以及其捆绑的周边环 ...

  7. js闭包的理解以及闭包中this的理解

    javascript 闭包.this 2016-01-25  js pl 闭包其实很好理解,但是由于经常把this和闭包绑在一起,从而加大了理解的难度,如果将他们分开考虑,那就清晰多了. 闭包 闭包并 ...

  8. JS / 闭包的理解

    闭包实际上就是一个函数,只不过这个函数有些特殊,它定义在另一个函数内部,通过它可以在 js 中模仿出访问 C++ 中的私有成员变量的效果. 代码如下: function Test() {var cou ...

  9. js闭包深入理解(Closure)

    闭包的概念 闭包是指有权访问另一个函数作用域中的变量的函数 闭包是基于词法作用域书写代码时所产生的必然结果. 函数对象可以通过作用域关联起来,函数体内的变量都可以保存在函数作用域内,这在计算机科学文献 ...

最新文章

  1. ssl *** 思科支持设备型号
  2. OSPF的高级配置(连载1)
  3. 实验5_JPEG解码
  4. GridView分页后RowCommand出错:索引超出范围
  5. 持续狂奔的拼多多快追上阿里了
  6. Java基础学习总结(74)——Java常见笔试题及答案汇总
  7. 系统学习深度学习(三十九)--基于模型的强化学习与Dyna算法框架
  8. PHP设计模式——职责链模式
  9. UML类图关系全面剖析
  10. atitit.二进制数据无损转字符串网络传输
  11. 计算机硬件常识知识,计算机硬件基础知识大全
  12. HDFS的shell命令
  13. vc2015静态编译方法
  14. FHIR标准和国际基于FHIR的互联互通实践(1):如何定义互联互通?
  15. 舞台音效控制软件_舞台音乐控制软件下载
  16. UEFI模式下安装ubuntu以及重装ubuntu教程
  17. ubuntu查看磁盘分区使用
  18. java isnull方法_isnull函数详解
  19. Android TextView设置下划线
  20. 举头望明月打计算机术语,与月亮有关的谜语

热门文章

  1. 阻塞队列(三):DelayQueue
  2. 学籍管理系统的需求分析
  3. CSV文件编辑器——Modern CSV for mac
  4. 锐龙r5 5500u相当于英特尔什么水平 r55500u属于哪个档次
  5. VsCode同步配置到另一台设备
  6. 吃透JAVA的Stream流操作,多年实践总结
  7. 7-15 福到了 c语言,7-54 福到了 (15 分)
  8. Electron屏幕截图的技术方案MacWindows
  9. 什么情况下使用$set?
  10. iphone 中的键盘切换产生的屏幕大小问题