首页 > 解决方案 > 如何传递带有参数的函数作为参数本身?

问题描述

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

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'}]

我的想法是创建一个查询函数,它以数组和...函数作为参数,并以数组作为上下文来调用此函数。当我按原样传递函数时,我设法做到了这一点,即没有参数,但正如你所看到的,它应该使用参数传递

现在我的代码如下所示:

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)

PS Initialy这个任务是为python做的,但我想在JS上做

标签: javascriptfunctionarguments

解决方案


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

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

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
)

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


推荐阅读