闭包
1.理解什么是闭包?
如果在函数func内部声明函数inner,然后在函数外部调用inner,这个过程即产生了一个闭包。
2.例题:
实现函数 makeClosures,调用之后满足如下条件:
1、返回一个函数数组 result,长度与 arr 相同
2、运行 result 中第 i 个函数,即 resulti,结果与 fn(arr[i]) 相同。
解决思路: 在ES6中,我们可以使用let来解决.这里介绍一下var和let的区别.
for (var i = 0; i <10; i++) {
setTimeout(function() {
// 同步注册回调函数到 异步的 宏任务队列。
console.log(i); // 执行此代码时,同步代码for循环已经执行完成
}, 0);
}
// 输出结果
// 10 共10个
// 这里面的知识点: JS的事件循环机制,setTimeout的机制等
// i虽然在全局作用域声明,但是在for循环体局部作用域中使用的时候,变量会被固定,不受外界干扰。
for (let i = 0; i < 10; i++) {
setTimeout(function() {
console.log(i); // i 是循环体内局部作用域,不受外界影响。
}, 0);
}
// 输出结果:
// 0 1 2 3 4 5 6 7 8 9
因此,同样的道理,上述例题我们都会想到使用一个for循环,在for循环外声明一个数组result,然后为result中的每个元素绑定一个对应的函数,因此let就发挥出了它的作用,JS代码如下:
function makeClosures(arr, fn) {
var result = []
for(let i = 0; i < arr.length; i++) {
result[i] = function() {
return fn(arr[i])
}
}
return result
}
欢迎大家留言评论哦!