JS常见操作之闭包

闭包

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
}

欢迎大家留言评论哦!

猜你喜欢

转载自blog.csdn.net/yldd_ldd/article/details/113645440