【问题标题】:Outer function returns an inner function with access to values from outer function外部函数返回一个内部函数,可以访问外部函数的值
【发布时间】:2015-05-08 23:38:14
【问题描述】:

我需要创建一个将传递给我的数据库服务器的函数。返回的函数会将单个项目作为参数并将该项目与需求列表进行比较。

为此,我需要一个函数生成函数,它接受一个数组作为参数,并返回内置该数组的内部函数。

这是一个例子:

function create_query (list_of_requirements) {
  return function (item) {
    var is_match = true
    // the next function sets is_match to false if the item fails
    list_of_requirements.forEach(check_if_item_meets_requirement)
    return is_match
  }
}

一个使用这个的例子:

function search (parsed_user_string) {
  db.get(create_query(parsed_user_string)).then(function(results){
    show_results(results)
  })
}

如何将需求列表构建到内部函数中?

【问题讨论】:

  • 看起来您已经在这样做了。你遇到了什么问题?
  • 我看到了两个问题:你永远不会调用create_query() 返回的函数。其次,我假设db.get() 期望它的参数是一个查询字符串,但你的函数只返回一个布尔值。
  • check_if_item_meets_requirements 也需要在内部函数的范围内,以便它可以分配给is_match
  • 如果db.get 的参数应该是一个回调,那么看起来你调用它是正确的。
  • db.get 需要将函数作为参数,并返回一个承诺。我在下面的回答使用闭包解决了这些问题。

标签: javascript lexical-scope


【解决方案1】:

我需要使用闭包。

这是一个更简单的解决方案示例。

function makePrinter (num) {
  (return function () {
    print(num)
    })
}

然后:

var print5 = makePrinter(5)
print5() > prints 5!

我仍然不太明白闭包是如何实现这一点的,但确实是这样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-12
    • 2018-09-22
    • 1970-01-01
    • 1970-01-01
    • 2020-04-11
    相关资源
    最近更新 更多