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

时间:2016-11-28 08:48:46

标签: javascript

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

示例:

完整的3个参数:

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

2个参数:

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

第二个参数中带有null的3个参数:

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

2 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:0)

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

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

你可以传递它,也可以不传递它,order function在这样的cases中不会被错误匹配。在继续进行之前,请检查typeof argument是否为connection.query

所以你基本上是在查看mysql的createQuery。如果你看一下mysql的源代码,你可以查看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; } } 函数如何处理它。

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

<div ng-controller="MyCtrl">
  <ul>
    <li>
      <span ng-click="showChilds(items[0])">{{items[0].name}}</span>
      <ul>
        <li ng-repeat="subItem in items[0].subItems" ng-show="items[0].active">
          <span>---{{subItem.name}}</span>
        </li>
      </ul>
    </li>
    <li>
      <span ng-click="showChilds(items[1])">{{items[1].name}}</span>
      <ul>
        <li ng-repeat="subItem in items[1].subItems" ng-show="items[1].active">
          <span>---{{subItem.name}}</span>
        </li>
      </ul>
    </li>
  </ul>
</div>