面试题常问问题之闭包
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
- 收藏
- 分享
- 文章举报
![](https://g.csdnimg.cn/static/user-reg-year/1x/1.png)