2016-11-28 82 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; 
    } 
}