Function类型
函数实际上是对象,每个函数都是Funcetion类型的实例,函数名实际上是一个指向函数对象的指针。
函数定义的三种方式
- 函数声明法
function sum(num1, num2){
return num1 + num2;
}
- 函数表达式
var sum = function(num1, num2){
return num1 + num2
};
注意使用此法,sum为变量名,且function后未跟函数名(不需要函数名,因为可通过变量名调用该函数)。此外,函数末尾有分号,就像声明其他变量时一样
3. 使用Function构造函数(不推荐)
Function构造函数可以接收任意数量的参数,但最后一个参数始终都被看成是函数体,而前面的参数则枚举出了新函数的参数
var sum = new Function('num1', 'num2', 'return num1 + num2');
函数名是指针
var sum = function(num1, num2){
return num1 + num2
};
var anotherSum = sum;
console.log(anotherSum(1, 2));//3
sum = null;
console.log(anotherSum(1, 2));//3
上述代码,先定义了一个sum( )函数用于求两个数的和,接着有定义一个函数anotherSum( )并赋予它sum( )函数相同的值,此时sum和anotherSum指向同一个函数,都能被调用并返回结果,并且切断sum对函数的指向将sum设置为null后,anotherSum ( )依旧正常调用。
注意:使用不带圆括号的函数名是访问函数指针,并不是调用函数
没有重载
将函数名看作指针,则能更好理解为何没有重载。后面的函数会覆盖前面的函数
function addSomeNumber(num){
return num + 100;
}
function addSomeNumber(num){
return num + 200;
}
console.log(addSomeNumber(100));//300
arguments
arguments是一个类数组对象(并不是真正意义上的数组:1.具有length属性;2.按索引方式存储数据;3.不具有数组的push,pop方法),存储着传入函数中的所有参数(实参),当我们不确定有多少个参数传递的时候,可以用arguments来获取
function fn(){
console.log(arguments);//[1, 2, 3]
console.log(arguments.length);//3
console.log(arguments[1]);//2
}
fn(1, 2, 3);
利用函数求任意个数数字的最大值
function getMax(){
var max = arguments[0];
for(var i=1; i<arguments.length; i++){
if (arguments[i] > max){
max = arguments[i];
}
}
return max;
}
console.log(getMax(1 ,2 ,4, 7));//7
console.log(getMax(123 ,254 ,41, 73, 54, 412, 102));//412
参考资料
- 《JavaScript高级程序设计》
- 阮一峰JavaScript标准参考教程(alpha)