特别是在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参数以优雅的方式?“。
答案 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 );
}
};