2

特别是在 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 - 以优雅的方式字符串参数?”。

4

3 回答 3

3

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

api = {
  // "public" function
  func: function(a) {
    if (typeof a == 'function') {
      a = a();
    }
    // rest of function
  }
}
于 2013-01-08T09:56:13.343 回答
2

我会去:

api = {
  func: function(a) {
    if(typeof a == 'function') a = a.call(this); // Transmit api as scope for a, may be useful for accessing api tools ...

    // Process a ...
  }
};
于 2013-01-08T09:56:26.667 回答
0
api = {
  func: function( a ) {
    typeof a == 'function' && a.call( this, arguments ); 
  }
};
于 2013-01-08T09:59:22.347 回答