代码之家  ›  专栏  ›  技术社区  ›  stackdave

javascript,省略函数中的参数,不影响函数

  •  0
  • stackdave  · 技术社区  · 8 年前

    我在javascript中看到很多函数都有3个参数,例如,第二个参数是一个值,第三个是一个函数,当省略第二个时,发送第三个参数(函数),就像第二个一样;没有错误。它是如何工作的? 有些情况下,第二个和第三个参数是函数,这样做吗?这背后的架构是什么?

    例如:

    全部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) 
    
    2 回复  |  直到 8 年前
        1
  •  1
  •   Danmoreng    8 年前

    在ES2015之前,有这样一种方式:

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

    function foo(param1, param2 = standard_value, param3 = standard_value){
        if(typeof param2 === "function"){
            param3 = param2;
        }
        // do stuff
    }
    
        2
  •  0
  •   Thalaivar    8 年前

    因此,函数查询中的第二个参数基本上是可选的。

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

    您可以通过它,也可以不通过它 order function 在这种情况下,不会出现不匹配 cases .你检查 typeof argument s,然后继续。

    所以你基本上是在看 connection.query mysql。如果您查看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;
       }
    }