JavaScript中函数调用时的参数传递
JavaScript中,function定义时的参数和调用时的参数其实可以不用完全一致的,当然书写比较讲究的可以严格保持一致,这也是一种好的风格。当然想省点儿事的,也有简化的写法。
比如函数定义如下:
function func(){
...
}
调用时来个
letx=func(a,b,c,d);
可不可以,当然可以,只要func()函数的定义体里能识别传入的这些入参,比如这样操作:
var total = 0;
for (var i = 0; i < arguments.length; i++) {
total += arguments[i];
}
return total;
再来个例子:
function func(a,b,c,d){
return (a||"")+(b||"")+(c||"")+(d||"")
}
let x=func("a","b");
console.log(x); //ab
这个例子中调用时入参比定义的少几个,少的几个会被认为传入的是undefined,只要代码里允许,那么是可以正常执行的。
这种情况其实很常见,经常我们很多函数是回调函数形式,回调函数的入参是一般error,res1,res2…,其实书写的时候并不一定需要写全它们,后面不需要的可以省略,但是不能从前面开始省略的,如果需要一个执行后的结果值传入的话,那么至少要传入error,res1 比如:
soap.createClient(wsurl,(err, client)=> {
...
});
如果只要执行完成就可以,不论是否出错或者结果如何,那么其实连参数都不需要传,比如:
fs.mkdir(tmppath,{ recursive: true },()=> {
...
});
另外要注意下,回调函数里的写法一般是一个一个的参数传入,但是promise的then函数里,就不一定是这样传递了,因为then的入参是前面promise的执行结果返回值里的resolve带出来的参数,可能是一个单值,可能是一个json对象,可能是一个数组。比如mysql2的查询
mysqlpool.query(sqlstr)
.then(([results,fields])=>{
});
如果你不需要fields,也可以直接写成
mysqlpool.query(sqlstr)
.then(([results])=>{
});
如果你连结果也不关心,只要执行了就行,那么可以写成:
mysqlpool.query(sqlstr)
.then(()=>{
});