JavaScript中的函数定义 不用指定形参的类型,调用也不对实参做任何类型检查,甚至连实参个数都不做检查。看看,多么粗暴和自由啊。
1 可选形参
当调用参数个数不够时,可以使用 /* optional */
来定义可选参数。
传入形参时,基础类型是传值, 其他是传地址。
function getPropertyNames(o, /* optional */ a) {
a = a || []
a.push("Adress")
for(var i in o) {
a.push(o[i])
}
return a;
}
// 调用
var a,b,c;
a = getPropertyNames([1,2]);
console.info(a);
var arr = ["name"]
b = getPropertyNames(["b"], arr);
console.info(b,arr);
运行结果:
["Adress", 1, 2]
["name", "Adress", "b"] ,["name", "Adress", "b"]
说明:
-
a = a || []
是一种惯用用法,使用前a
必须要先声明,这里a
作为形参,相当于var a
- 实际运行结果,表明参数
a
是传地址
2 实参
2.1 可变实参(个数)
function max( /*...*/ ) {
var max = Number.NEGATIVE_INFINITY;
console.info(max);
for (var i = 0; i < arguments.length; i++) {
if (arguments[i] > max) {
max = arguments[i];
}
}
return max;
}
console.info(max(10, 6, 80))
结果:
80
2.2 实参内置对象
arguments 参数数组
如果实际参数传入的个数大于函数定义的形参个数,多出的可以使用arguments[i]
来获取,arguments
是指向实参对象的引用(传地址:改变arguments[i]
,实参也会一并改变)
callee 和 caller属性
ECMAScrip5严格模式下,这两个属性不可用。非严格模式下,callee表示当前正在执行的函数。