【问题标题】:How do I pass a function with arguments as an argument itself?如何传递带有参数的函数作为参数本身?
【发布时间】:2021-10-08 17:07:43
【问题描述】:

我有一个像这样的对象列表:

friends = [
{'name': 'Sam', 'gender': 'male', 'sport': 'Basketball'},
{'name': 'Emily', 'gender': 'female', 'sport': 'volleyball'},
]

我需要创建函数“query”、“select”和“field_filter”来处理这些列表。所有这些都应该看起来像这样:

»> result = query(
friends,
select('name', 'gender', 'sport'),
field_filter('sport', *('Basketball', 'volleyball')),
field_filter('gender', *('male',)),
)
»> result
[{'gender': 'male', 'name': 'Sam', 'sport': 'Basketball'}]

我的想法是创建一个查询函数,它接受一个数组和...函数作为参数,并使用一个数组作为 this 上下文调用这个函数。当我按原样传递函数(即不带参数)时,我设法做到了这一点,但正如您所见,它应该通过 with 参数传递

目前我的代码如下所示:

let friends = [
  {'name': 'Sam', 'gender': 'male', 'sport': 'Basketball'},
  {'name': 'Emily', 'gender': 'female', 'sport': 'volleyball'},
]

const query = function(arr, ...funcs) {
  for (i of funcs) {
    i.call(arr)
  }
}

const select = function(...args) {
  console.log(this)
}

query(friends, select, select, select)

附:最初这个任务是针对 python 的,但我想在 JS 上完成它

【问题讨论】:

  • function.call 的第一个参数是函数的 this 值,这就是你的调用失败的原因......你可以只做 i(arr)i.call(null, arr) 或 @987654328 @ 或 i.apply(null, arr) - 后两个将调用函数,将朋友的元素作为单独的参数 - 前两个将调用函数,数组作为唯一参数
  • 刚刚注意到 - 你 console.log(this) 应该输出朋友数组,它不适合你吗?
  • @Bravo 正如您在示例中看到的那样,必须已经使用参数调用函数,我的想法是将数组作为上下文传递以避免这种情况。在我的想法中,所有的工作都会像this.fliterreturn this 等。如果我写得不够清楚,请见谅
  • 是的,有什么问题?您正在使用参数 arr 作为函数的 this 值调用函数...您可能不想这样做,我已经解释过了
  • @Bravo 再次,抱歉,如果我在这里不清楚,但问题是当我这样调用查询函数时:query(friends, select('name')) 函数在错误的上下文和查询函数内部立即运行我得到的是未定义的

标签: javascript function arguments


【解决方案1】:

我发现完美解决这个问题的答案是闭包:如果函数立即运行并在错误的上下文中执行主体 - 它应该返回一个接受参数并在适当的上下文中调用的函数。这就是我的意思:

编辑:显然它不是闭包,但概念是相同的 - 我返回函数需要适当的上下文

let friends = [
  {'name': 'Sam', 'gender': 'male', 'sport': 'Basketball'},
  {'name': 'Emily', 'gender': 'female', 'sport': 'volleyball'},
]

const query = function(arr, ...funcs) {
  for (i of funcs) {
    i.call(arr) // calls a function with proper context
  }
}

function select(...args) {
  return function() { // return a function which is being called inside query function
    // body of a function, e.g. console.log(this, args)
  }
}

let result = query(
  friends, 
  select('name', 'gender') // works perfectly
)

请随意指出一些错误/不好的做法。毕竟我连小学生都不是:)

【讨论】:

    猜你喜欢
    • 2010-11-20
    • 1970-01-01
    • 2011-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-08
    相关资源
    最近更新 更多