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

时间:2013-01-08 09:49:27

标签: 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 -string参数以优雅的方式?“。

3 个答案:

答案 0 :(得分:3)

这是一种实现它的简单方法:

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

答案 1 :(得分: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 ...
  }
};

答案 2 :(得分:0)

api = {
  func: function( a ) {
    typeof a == 'function' && a.call( this, arguments ); 
  }
};