javascript库如何忽略某些参数,或者制作某些函数参数" optional"?

时间:2015-01-08 03:51:36

标签: javascript node.js function

我将使用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参数?

4 个答案:

答案 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