javascript - 设计接受字符串或函数的 JavaScript 函数

标签 javascript function signature

特别是在 Javascript 中,API 公开接受特定参数的字符串或函数的函数是很常见的。字符串提供“已初始化”值,而函数在运行时生成值。

// Call foo with known value
api.foo('bar')
// or defer value determination to run-time
api.foo(function() { return 'bar'; }

这更加灵活,因为有时传递给这些 API 调用的参数直到运行时才知道,例如

api.foo(function() { return prompt('foo or bar ?'); });

这种方法在某种程度上保留给面向公众的函数(因为它们引入了更复杂的签名,并且可能有问题 - 最好保持较低的数量),但是,编写此类函数的好习惯是什么?

类似的东西

api = {
  // "public" function
  func: function(a) {
    if (typeof(a) == 'function')
      return this._func(a());
    else
      return this._func(a);
  },
  // Actual implementation
  _func: function(a) {
    [...]
  }
}

应该可以,但肯定有更高效/优雅的替代方案。有什么想法吗?

更新:根据 @camus 的评论(以及现已消失但相关的答案),这里有一个更新,澄清了我的意图并解释了这与 API 的关系

考虑一下,在编写函数时,我们不知道它将以哪种方式调用,并且我们不想对其进行限制性假设。该函数被设计为通用的,因此可以使用不同的签名多次调用它。我们可以强制调用者使用字符串,但让返回字符串的函数来完成这项工作会很方便。这个函数可以传递额外的参数(比如索引,...),这当然是特定于 API 上下文的,但总体思路是“如何处理返回 a 的字符串和函数” - 以优雅的方式进行字符串参数?”。

最佳答案

这是一个简单的实现方法:

api = {
  // "public" function
  func: function(a) {
    if (typeof a == 'function') {
      a = a();
    }
    // rest of function
  }
}

关于javascript - 设计接受字符串或函数的 JavaScript 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14212220/

相关文章:

python pandas DataFrame 遍历行并比较两列并应用函数

c++ - 具有由整数确定的固定数量参数的函数

java - 如何获取接口(interface)内部方法的签名?

function - Scala 编译器在请求第二个参数集中的函数时提示 "ambiguous reference to overloaded definition"

javascript - 我希望我的菜单一直 float 直到折叠,然后我希望它居中

Javascript:实现此效果的内存有效方法

javascript - 将 AngularJS 代码构造成 WAR 包

php - 在 PHP 中调用带参数的 Javascript 函数

java - 如何从外部 APK 文件将签名读入 ByteArray

Javascript 代码未在 WordPress 页面中运行