我将使用Node.js作为示例,但我在许多文档中都看到了这一点:
(来自net
模块文档):
net.createConnection(port,[host],[connectListener])
创建与主机端口的TCP连接。如果省略host,则假定为“localhost”。 connectListener参数将被添加为'connect'事件的侦听器。
接下来是示例代码,如下所示:
a = net.createConnection(8080, function(c){
console.log('do something');
});
我的问题是createConnection
函数需要1到3个参数。上面,我通过了两个。 Node怎么能知道我传入的函数参数是connectListener
参数而不是host
参数?
答案 0 :(得分:4)
如果参数有不同的类型,您只需测试它们即可。此处port
可能是一个数字,host
是一个字符串,connectionListener
是一个函数。
例如:
function createConnection(port, host, connectionListener) {
if (typeof host === 'function') {
conectionListener = host;
host = null;
}
if (!host) {
host = 'localhost';
}
// ...
}
当然,如果参数属于同一类型,则不起作用。对于这种情况,没有一般的解决方案。
答案 1 :(得分:1)
我并不是特别了解createConnection
的实现,但是一种可能的方法是计算传递给函数的参数以及检查它们的类型,例如:
function createConnection(port, host, connectListener) {
var f = connectListener;
if(arguments.length === 2 && typeof host === "function") {
f = host;
host = "localhost";
}
console.log("Host: " + host);
console.log("Port: " + port);
f();
}
createConnection(8080, function() {
console.log("Connecting listener...");
});
这是fiddle。
答案 2 :(得分:0)
也许是在内部调用net.createConnection(options, [connectionListener])
,以便正确映射参数。
参考:
http://nodejs.org/api/net.html#net_net_createconnection_options_connectionlistener
答案 3 :(得分:0)
可以检查类型,因此检查参数2是一个允许这种行为的函数Handling optional parameters in javascript