定义
闭包是指有权访问另一个函数作用域中的变量的函数,通常是在嵌套函数中实现。
function fn1(){
var a = 1;
return function fn2(){
console.log(a++);
}
}
var fn = fn1();
fn();//1
fn();//2
必包的设计解决了什么问题
动态作用域难以模块化的问题
必包优缺点
优点
- 保护私有变量,避免全局污染
- 延长变量生命周期
- 实现模块化
- 保持状态
缺点
- 内存占用
- 性能损耗:涉及到作用域链查找过程
必包怎么回收
如果必包引用的函数是全局变量,那么必包会一直存在到页面关闭,如果这个必包以后不在使用的话,就会造成内存泄露 如果这个必包引用的是局部变量,等函数销毁后,在下次JavaScript引擎执行垃圾回收时,判断必包这块内容如果不再被使用了,那么Javascript引擎垃圾回收器就会回收这块内存
应用场景
- for循环
- 封装私有变量和函数
- 模块化实现
- 实现高阶函数
- 实现回调函数
- 模拟块级作用域
- React Hook
for循环
for(var i = 0; i < 9; i++){
(function(i){
console.log(i);
})(i)
}
封装私有变量和函数
function createPerson(){
var _name;
return {
getName:function(){
return _name;
},
setName:function(name){
_name = name;
}
}
}
var lwp=createPerson();
lwp.setName('兰为鹏')
console.log(lwp.getName())//兰为鹏
模块化实现
(function(){
function add(a, b){
return a + b;
}
function sub(a, b){
return a - b;
}
globalThis.countFn={
add:add,
sub:sub
}
})();
var sum=countFn.add(1,2);
console.log(sum)
实现高阶函数
function addBy(a){
return function(b){
return a + b;
}
}
var addTwo = addBy(2);
console.log(addTwo(5))
实现回调函数
function getNameAync(cb){
setTimeout(()=>{
cb && cb('lwp');
},2000)
}
getNameAync((name)=>{
console.log(name);
})
React Hook
参考
- 李兵《浏览器工作原理与实践》
- juejin.cn/post/726418…
- blog.csdn.net/My_Soul_/ar…
- React Hook实现
很多面经找起来很麻烦,也找不全,然后还得自己找答案,有些面试宝典虽然完整,但是看不懂,因此干脆自己进行整理,整理最全的前端面试题以及最容易理解的答案,附上参考链接或者视频链接,再加上自己调试的代码,我不相信这样还看不懂。 地址
也可以一起讨论:wx:lan_weipeng备注前端面试群