2016-11-28 326 views
0

我见过很多javascript中有3个参数的函数,例如第二个参数是一个值,第三个函数,当您省略第二个参数时,并发送第三个参数(函数),如第二个参数;没有错误。它如何工作? 有情况下,第二个和第三个参数是功能,并做到这一点?这背后的架构是什么?javascript,省略函数中的参数,不影响函数

实例:

完整的3个参数:

client.query('SELECT $1::int AS number', ['1'], function(err, result) { 

2参数:

client.query('SELECT * from accounts', function(err, result) 

3参数与在第二个参数为空:

client.query('SELECT * from accounts', null, function(err, result) 

回答

1

ES2015之前有这个方法:

function foo(param1, param2, param3){ 
    if(!param2){ 
     param2 = standard_value; 
    } 
    if(!param3){ 
     param3 = standard_value; 
    } 
    if(typeof param2 === "function"){ 
     param3 = param2; 
    } 
    // do stuff 
} 

有了ES2015您可以使用此:

function foo(param1, param2 = standard_value, param3 = standard_value){ 
    if(typeof param2 === "function"){ 
     param3 = param2; 
    } 
    // do stuff 
} 
+0

不是真的,这不会让你使用参数2作为一个功能的可能性,你将不得不至少调查论证,或在案件中移动参数的最后一项是缺少 – Icepickle

+0

@Ippickle我刚才编辑过。 – Danmoreng

+0

谢谢,问题是有时候没有关于javascript npm包的文档,关于哪个是可选参数或者不是,但是现在我明白了更好。 – stackdave

0

所以基本上在函数查询你的第二个参数是可选。

client.query('SELECT $1::int AS number', ['1'], function(err, result) {}); 

您可以通过它或没有必要通过它,在order function没有得到在这样cases不匹配。在进一步处理之前检查typeof argument

所以你基本上看着mysql的connection.query。如果您查看mysql的源代码,您可以查看createQuery函数了解它们的处理方式。

https://github.com/mysqljs/mysql/blob/2aa8b6c8ea2eb93d4d2afa42920362b707e39aed/lib/Connection.js#L37

Connection.createQuery = function createQuery(sql, values, callback) { 
    //look below on how they are handling values 
    if (typeof values === 'function') { 
     cb = bindToCurrentDomain(values); 
    } else if (values !== undefined) { 
     options.values = values; 
    } 
}