您的位置:首页 > 职场人生

面试题常问问题之闭包

2020-02-16 17:18 363 查看
闭包
什么是闭包?
闭包就是函数A里面返回了一个函数B
函数B中使用了函数A中的变量,函数B就称为闭包。

function A() {
let a = 1
function B() {
console.log(a)  //使用了A中的变量
}
return B
}

为什么A已经出栈了,函数B还能访问到A中的变量呢?
因为此时A是存储在堆上的,现在js可以通过**逃逸分析**
辨别哪些需要存储在堆中,哪些需要存储在栈中。
经典面试题
for ( var i=1; i<=5; i++) {
setTimeout(function timer() {
console.log( i );
}, i*1000 );
}
因为时间函数是异步,所以此时会将循环先执行完
这个时候i=6,所以会输出5个6。
循环中怎么使用闭包解决 var 定义函数的问题?
for (var i = 1; i <= 5; i++) {
(function(j) {
setTimeout(function timer() {
console.log(j);
}, j * 1000);
})(i);
}
立即执行函数里面有一个时间函数
时间函数里面用到立即执行函数传递的参数j。

另外还有两种方法可以解决
第一种:
使用 setTimeout 的第三个参数
for(var i=1,i<=5,i++){
setTimeout(function timer(j){
console.log(j);
},j*1000,i),
};

第二种:
直接使用let
for ( let i=1; i<=5; i++) {
setTimeout(function timer() {
console.log( i );
}, i*1000 );
};
闭包的特征?
1.封闭性:
外界无法访问闭包内的数据
如果在闭包内声明变量,外界无法访问
除非闭包主动向外界提供接口。
2.持久性:
一般函数调用完毕, 数据就会出栈销毁
但是闭包会让数据一直存在。
闭包的优缺点?
优点:避免创建重复变量。
缺点:消耗内存,造成网页性能问题。
  • 点赞 2
  • 收藏
  • 分享
  • 文章举报
Reviewlike 发布了24 篇原创文章 · 获赞 12 · 访问量 3172 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: