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

How do javascript libraries ignore certain parameters, or make certain function parameters "optional"?

我将使用 Node.js 作为示例,但我在很多文档中都看到了这一点:

(来自 net 模块文档):

net.createConnection(port, [host], [connectListener])

Creates a TCP connection to port on host. If host is omitted, 'localhost' will be assumed. The connectListener parameter will be added as an listener for the 'connect' event.

后面是示例代码,例如:

a = net.createConnection(8080, function(c){
    console.log('do something');
});

我的问题是 createConnection 函数需要 1 - 3 个参数。以上,我分两次通过。 Node 怎么知道我传入的函数参数是 connectListener 参数而不是 host 参数?

可能是内部调用net.createConnection(options, [connectionListener]),使参数映射正确

参考:

http://nodejs.org/api/net.html#net_net_createconnection_options_connectionlistener

可以检查类型,因此检查参数 2 是一个允许这种行为的函数 Handling optional parameters in javascript

如果参数有不同的类型,你可以简单地测试一下。这里 port 可能是一个数字,host 是一个字符串,connectionListener 是一个函数。

例如:

function createConnection(port, host, connectionListener) {
    if (typeof host === 'function') {
        conectionListener = host;
        host = null;
    }
    if (!host) {
        host = 'localhost';
    }
    // ...
}

当然,如果参数是同一类型,这就不行了。这种情况没有通用的解决方案。

我不是特别了解 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.