首页 > 试题广场 >

使用闭包

[编程题]使用闭包
  • 热度指数:83842 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
实现函数 makeClosures,调用之后满足如下条件:
1、返回一个函数数组 result,长度与 arr 相同
2、运行 result 中第 i 个函数,即 result[i](),结果与 fn(arr[i]) 相同

示例:
var arr = [1,2,3]; 
var fn = function (x) { 
    return x * x; 
}
var result = makeClosures(arr,fn);
(result[1]() === 4) === (fn(arr[1]) === 4) === true
推荐
简单的描述闭包:如果在函数func内部声明函数inner,然后在函数外部调用inner,这个过程即产生了一个闭包。
题目要求的是返回一个函数数组,如果在循环中直接写result[i] = function(){return fn(arr[i]);}或者result.push(function(){return fn(arr[i]);}),最终的结果是不正确的,因为在每次迭代的时候,那样的语句后面的方法并没有执行,只是创建了一个函数体为“return fn(arr[i]);”的函数对象而已,当迭代停止时,i为最终迭代停止的值,在函数被调用时,i依旧为最终迭代停止的值,因此无法返回正确的结果。
为了解决这个问题,需要声明一个匿名函数,并立即执行它。
function(num){return function(){return fn(arr[num]); }; }(i),函数执行后,i立即传入并被内部函数访问到,因此就能得到正确的结果。闭包允许你引用存在于外部函数中的变量。
下面的代码使用的是forEach循环
function makeClosures(arr, fn) {
  var result = [];
     arr.forEach(function(e){
         result.push(function(num){
             return function(){
                 return fn(num);
             };
         }(e));
     });
     return result;
 }

编辑于 2015-08-18 21:03:19 回复(36)
简单粗暴
function makeClosures(arr, fn) {
    const result=[]
    arr.forEach(v=>{
        result.push(()=>fn.call(v,v))
    })
    return result
}

发表于 2023-06-28 17:17:18 回复(0)
function makeClosures(arr, fn) {
    return arr.map((item) => {
        return () => fn(item);
    });
}
发表于 2023-06-06 14:52:36 回复(0)
function makeClosures(arr, fn) {
    let result = [];
    for(let i=0; i<arr.length; i++){
        let res = arr[i];
        let fun = (()=>{return fn.bind(this,arr[i]);})(i);
        result.push(fun);
    }
    return result;
}

核心问题在于for循环的index索引,此处必须得用匿名函数包传i,作为闭包内正确引用外部变量的方式
发表于 2023-04-28 11:48:31 回复(0)
function makeClosures(arr, fn) {
    return arr.map(item=>()=>fn(item))
}

发表于 2023-04-23 20:35:12 回复(0)
function makeClosures(arr, fn) {
            return arr.map((item,index)=>{
                return function(){
                    return fn(item)
                }
            })
        }
发表于 2023-01-13 18:22:45 回复(0)
function makeClosures(arr, fn) {
    return arr.map((item)=>fn.bind(null, item))
}


发表于 2022-11-28 14:44:33 回复(0)
利用bind不执行的特点
function makeClosures(arr, fn) {
     let tmp = []
     arr.forEach(element => {
        tmp.push(fn.bind(this,element))
     });
     return tmp   
}
发表于 2022-11-15 20:59:01 回复(0)
function makeClosures(arr, fn) {
    const res = new Array(arr.length)
    for(let i = 0;i < res.length;i++){
        let x = arr[i]
        res[i] = function(){
            return fn(x)
        }
    }
    return res
}
利用闭包形成独立的作用域
发表于 2022-11-03 20:39:32 回复(0)
function makeClosures(arr, fn) {
let newArr = []
      for(let i = 0;i<arr.length;i++)
      {
        
        let newFn = function(){
          let x = arr[i]
          return fn(x)
        }
        newArr.push(newFn)
      }
      return newArr
}
发表于 2022-10-25 12:00:26 回复(0)
function makeClosures(arr, fn) {
    return arr.map(item=>fn.bind(null, item))
}
一行流
发表于 2022-09-24 12:44:06 回复(0)
function makeClosures(arr, fn) {
  const result = Array(arr.length).fill(0)
  return result.map((item, index) => {
    return function () {
      return fn(arr[index])
    }
  })
}

发表于 2022-09-03 14:51:00 回复(0)
function makeClosures(arr, fn) {
    let res = [];
    arr.forEach(item => {
        res.push(() => fn(item));
    })
    return res;
}

发表于 2022-08-19 16:45:06 回复(0)
上代码
function makeClosures(arr, fn) {
  return   arr.map((item) => {
        return function() {
            return  fn(item)
        }
    })
}
发表于 2022-08-15 11:21:55 回复(0)
function makeClosures(arr, fn) {
    const result = []
    arr.forEach((item, index) => {
        result[index] = () => fn(item)
    })
    return result
}
发表于 2022-07-22 15:59:32 回复(0)
function makeClosures(arr, fn) {
    return arr.map((item,index)=>{
        return ()=>{
            return fn(item)
        }
    })
}

发表于 2022-07-07 13:47:20 回复(0)

关键词:闭包、返回数组
回顾闭包定义:一个函数对象在JS中被创建的时候同时创建了闭包,闭包是由该函数对象和它所在的语境而构成的一个组合。通常返回一个函数的引用。

function makeClosures(arr, fn) {
  return arr.map((val) => {
    return () => {
      return fn(val);
    }
  })
}
发表于 2022-05-26 00:06:04 回复(0)
function makeClosures(arr, fn) {
    var result = [];
    arr.forEach(el => {
        result.push(function () {
            return fn(el);
        });
    })
    return result;
}

发表于 2022-02-15 16:47:59 回复(0)