闭包

闭包用于解决,外部函数访问不到内部函数的变量,借助内部函数可以访问到外部函数的变量的特性。就是函数嵌套函数,如下。

代码解释:

function outerFun() {let a = 10;function innerFun() {console.log(a);}return innerFun;
}
let res = outerFun();
res();

输出:10。

这就是函数嵌套函数,内部函数是闭包。内部函数的变量可以访问外部函数的变量a,所以可以输出10。

正常情况下,函数执行完毕,内存变量会销毁,也就是释放内存空间,那么就不会把输出结果10,而是输出undefined或者报错

那为什么上面还会输出结果呢?

因为闭包函数就是建立在函数内部的,内部函数没有执行完成,在上面的代码中,内部函数innerFun作为返回值被赋值给了res,内部函数innerFun并没有执行完成,外部函数变量就不会被销毁,它可以访问到外层函数的变量,所以就会导致外层函数执行完毕时,它的作用域不会被销毁。直到闭包函数也不存在。

闭包代码片段

  1. 每次外部函数执行的时候,都会开辟一块内存空间,外部函数的地址不同,都会重新创建一个新的地址:
function outerFn(){var i = 0; function innerFn(){i++;console.log(i);}return innerFn;
}
var inner = outerFn();  //每次外部函数执行的时候,都会开辟一块内存空间,外部函数的地址不同,都会重新创建一个新的地址
inner();
inner();
inner();
var inner2 = outerFn();
inner2();
inner2();
inner2();

依次输出:1 2 3 1 2 3

var i = 0;
function outerFn(){function innnerFn(){i++;console.log(i);}return innnerFn;
}
var inner1 = outerFn();
var inner2 = outerFn();
inner1();
inner2();
inner1();
inner2();
inner1();
inner2();  //1 2 3 4 5 6

依次输出:1 2 3 4 5 6

闭包经典面试题

for (var i = 0; i < 5; i++) {setTimeout(function () {console.log(i++);}, 1000)
}
console.log(i);

先输出5,1秒后依次输出5,6,7,8,9。

function fnnn(){var arr = [];for(var i = 0;i < 5;i ++){arr[i] = function(){return i;}}return arr;
}
var list = fnnn();
for(var i = 0,len = list.length;i < len ; i ++){console.log(list[i]());
}

输出五个5。

防抖和节流就是两个典型的闭包案例

在进行窗口的resize、scroll,输入框内容校验等操作时,如果事件处理函数调用的频率无限制,会加重浏览器的负担,导致用户体验非常糟糕。此时我们可以采用debounce(防抖)和throttle(节流)的方式来减少调用频率,同时又不影响实际效果。

防抖是,当在一秒内快速多次点击按钮时,只执行最后一次点击的请求,有效的减少发送请求的次数。

如,在input输入框里快速输入时,取输入完成的结果发送请求,而不是从第一个字符就开始发送,这就是 “只执行最后一次点击的请求” 的意思。

<body><input type="text"><script>let input = document.querySelector('input')function fun1() {console.log('点击了!!!');}input.addEventListener('keyup', debounce(fun1, 1000))function debounce(fn, delay) {let timer = null;return function () {if (timer) {clearTimeout(timer)}timer = setTimeout(() => {fun1()}, delay)}}</script>
</body>

节流是,控制事件执行次数,保证一定时间段内只调用一次事件处理函数。

如,滚动事件,少则一秒内发生几百次触发,非常消耗性能,利用闭包和定时器,可以保证执行次数。

函数执行的前提条件是,持续触发时,持续关闭开关,等到setTimeout到时间了,再把开关打开,函数就会执行了。

<style>body {height: 2000px;}
</style>window.onscroll = throttle(function () {console.log('滚动啦!');
}, 1000)function throttle(fn, delay) {let valid = true;return function () {if (valid) {setTimeout(() => {// fn()func.apply(this, arguments)valid = true}, 1000)}}valid = false;
}

闭包代码理解参考:
闭包,看这一篇就够了——带你看透闭包的本质,百发百中

前端面试:闭包,以及节流和防抖相关推荐

  1. 前端面试查漏补缺--(一) 防抖和节流

    前言 本系列最开始是为了自己面试准备的.后来发现整理越来越多,差不多有十二万字符,最后决定还是分享出来给大家. 为了分享整理出来,花费了自己大量的时间,起码是只自己用的三倍时间.如果喜欢的话,欢迎收藏 ...

  2. 前端面试查漏补缺--(二) 垃圾回收机制

    前言 本系列最开始是为了自己面试准备的.后来发现整理越来越多,差不多有十二万字符,最后决定还是分享出来给大家. 为了分享整理出来,花费了自己大量的时间,起码是只自己用的三倍时间.如果喜欢的话,欢迎收藏 ...

  3. 前端面试查漏补缺--(三) 跨域及常见解决办法

    前言 本系列最开始是为了自己面试准备的.后来发现整理越来越多,差不多有十二万字符,最后决定还是分享出来给大家. 为了分享整理出来,花费了自己大量的时间,起码是只自己用的三倍时间.如果喜欢的话,欢迎收藏 ...

  4. 前端面试查漏补缺--(十) 前端鉴权

    前言 本系列最开始是为了自己面试准备的.后来发现整理越来越多,差不多有十二万字符,最后决定还是分享出来给大家. 为了分享整理出来,花费了自己大量的时间,起码是只自己用的三倍时间.如果喜欢的话,欢迎收藏 ...

  5. 前端面试--什么是防抖和节流

    写在前面 CSDN话题挑战赛第1期 活动详情地址:https://marketing.csdn.net/p/bb5081d88a77db8d6ef45bb7b6ef3d7f 参赛话题:前端面试宝典 话 ...

  6. 防抖 节流_【前端面试】节流与防抖

    我们用两张图表示什么是节流和防抖. 防抖 节流 由图可见,防抖的意思是,当用户在一段时间内连续频繁的试图执行一个函数的时候,只有最后一次,函数被真正的执行.节流的意思是,当用户在某一个时刻执行了一次函 ...

  7. web前端面试高频考点——JavaScript 篇(一)【JS的三座大山 】 原型和原型链、作用域和闭包、异步

    系列文章目录 JavaScript 知识梳理,收录了web前端面试 95%以上 的高频考点,满满的干货.给你做一个高效的知识梳理,为你的面试保驾护航! 内容 参考链接 HTML & CSS 篇 ...

  8. 防抖 节流_防抖节流与前端性能优化

    在我们日常的开发中经常会用到一些容易被反复触发的事件.比如:scroll.resize.鼠标事件(mousemove,mouseover等).键盘事件(keyup.keydown). 频繁触发回调导致 ...

  9. 前端面试官问闭包,怎样回答脱颖而出

    闭包这个话题一直都是前端面试的重点,下面我将结合自己的春招面试经验,关于闭包这个问题讲讲技术面试官会对它进行怎么一个提问? 1.闭包是什么? 闭包是js的一种语法特性. 闭包就是能够读取其他函数内部变 ...

  10. vue防抖和节流是什么_前端节流和防抖的区别

    在监听某类事件时,如监听元素滚动或表单input事件时,处理函数在短时间内被频繁调用. 如果处理函数还需要调用后台接口,那么可能上次还没有响应,下一次请求又来了.这样无意中增加了服务器的压力,而且对用 ...

最新文章

  1. BGR图像与HSV图像互相转换(opencv)
  2. 黑客声称盗取微软GitHub账号500GB数据,网友:这些最终都会开源的
  3. PostgreSQL学习手册(常用数据类型)
  4. 02-UILabel比例颜色填充之歌词效果实现
  5. mongoengine.NotUniqueError
  6. php实现金币提现,PHP实现微信提现功能
  7. 阿里千万实例可观测采集器-iLogtail正式开源
  8. cpn tools查看运行时间_Jmeter在Linux下的运行测试
  9. 流量劫持能有多大危害?
  10. C++ 构造函数 与 析构函数
  11. 布局管理器 4----- 相对布局
  12. oracle数据恢复
  13. 985 硕士待业200天,工作 10 年存款 2W : 累死你的不是工作,而是“选择”
  14. StyleGAN图像风格转换相关经典论文、项目、数据集等资源整理分享
  15. 2020年高压电工考试APP及高压电工模拟考试软件
  16. 金融时间序列及Matlab实现
  17. Mac/Win 下浏览器网页长截屏(不安装截图软件实现)
  18. 中国传统的节日(端午节)
  19. vue树形权限菜单_vue树形菜单
  20. 游戏企业该如何做好网络安全防护?

热门文章

  1. SQL Server 2008 安全性
  2. c语言 命令行走迷宫小游戏
  3. python tensorflow 交通标志识别
  4. 轻量级Qt键盘-更新谷歌汉字库
  5. 博尔赫斯,卡尔维诺和艾柯(Borgers, Calvino, Eco)
  6. 软件开发工具上云,华为云有备而来
  7. Hybris IMPEX
  8. 谨防理财类App漏洞,爱加密全力出击护安全
  9. Javascript 之 ES7 新特性详解
  10. Unity调用PC摄像头