1.用功能句定义
我们先举个例子。 该函数的作用是返回数组元素之和;
function sumArray(arr) {
var sum = 0;
for(var i = 0,aLength = arr.length;i < aLength;i++) {
sum += arr[i];
}
return sum;
}
关键字function 前面有一个空格。 sumArray 是函数的名称。 它的命名约定与变量名相同:只能包含字母、数字、下划线和欧元符号。 它不能以数字开头,也不能是关键字。
括号中的参数也称为形式参数,只需要参数名称。 参数可以是0个、1个或多个,用,分隔,函数体包含在{}中间。 包含一个或多个单词和句子。 函数体用于实现函数的功能。
关键字return旁边是函数的返回值,函数也可以没有返回值。 函数执行完毕后,“return”这句话就会退出执行,“return”下面的那句话将不再运行。 返回值是函数的输出。
使用这些方法定义的函数可以在函数定义之上或前面调用,只要该函数和调用该函数的语句位于同一源文件中。
2. 用表达式定义
以表达式的形式定义函数就是使用赋值表达式将函数参数赋给变量。 这显然是将函数视为变量。 此时,函数可以有名称,也可以没有名称。 没有名称的函数称为匿名函数。
有名字;
var funct = function getMax(a,b) {
return a>b?a:b;
};//注意这后面的分号不能少,因为我们定义的是一个变量!
与用函数语句定义不同,函数只能在函数定义语句之后调用,并且调用时只能使用变量名funct,不能使用函数名getMax,如:
var funct = function getMax(a,b) {
return a>b?a:b;
};
console.log(funct(1,2));//输出2
匿名函数;
所谓匿名函数,就是紧跟在关键字函数后面的参数列表:
var funct = function(a,b) {
return a>b?a:b;
};
该函数没有名称。 它被赋予变量 funct 一个形式参数,因此称为匿名函数。 同样,这个函数也只能在这句话之后调用。
var funct = function(a,b) {
return a>b?a:b;
};
console.log(funct(1,2));//输出2
摘要: 使用表达式定义函数可以立即使用。 一旦定义,函数只能在这句话之后调用。
3. 函数调用
在实际训练中,我们介绍了对象可以有自己的方法,当然这些也是函数。 该函数的调用与上面两层定义的函数略有不同。
//函数的定义:求三个数的最大值
function max(a,b,c) {
if(a > b) {
if(a > c)
return a;
else
return c;
}
else {
if(b > c)
return b;
else
return c;
}
}
//调用该函数
var result = max(1,2,3);//result为3
console.log(result);//输出3
调用函数时,需要传入与数组相同数量的具体值。 上面的函数有3个参数,所以调用下面的时候,传入了3个具体值,1传给参数a,2传给参数a。 参数b、3被传递给参数c。 函数的返回值通过形参符号=传递给变量result。 如果函数体中没有return关键字,则返回undefined。
调用对象中定义的函数:
var ob = {
id:1,
getMax:function(a,b) {
return a>b?a:b;
}
};
var result = ob.getMax(2,1);//result值为2
var result1 = ob["getMax"](2,1);//result1的值也是2
与上一篇不同的是,这里定位函数需要使用对象名.函数名或者对象名[“函数名”],其他都一样。
4. 未定义的形式参数
大多数编程语言都会检测调用函数时传入的形式参数的数量和类型,但 JavaScript 既不检测形式参数的类型,也不检测形式参数的数量。
JavaScript 中的形参会按照从左到右的顺序匹配数组,例如:
function myFunction(a,b,c) {
console.log(a);
console.log(b);
console.log(c);
}
myFunction(1,2,3);
实参1传入数组a,实参2传入数组b,实参3传入数组c。 当形参的数量多于指定的值时,右侧的数组将传递值undefined。 喜欢:
function myFunction(a,b,c) {
console.log(a);
console.log(b);
console.log(c);
}
myFunction(1,2);
实参1传入数组a,实参2传入数组b,undefined传入数组c。 如果只想向左侧参数传递数据,则可以将 undefined 传递给前几个形参。 喜欢:
function myFunction(a,b,c){
console.log(a);
console.log(b);
console.log(c);
}
myFunction(undefined,1,2);
上述两种做法都不够严谨。 最佳实践是为可能传递未定义值的数组设置默认值。 喜欢:
function getSum(a,b,c) {
if(c === undefined)
c = 0;
console.log(a+b+c);
}
myFunction(1,2);
5.实参对象
JavaScript 中一切都是对象,实际参数也是对象。 有一个特殊的名称参数。 这个对象可以看成是一个字段(类字段javascript的函数方法,不是真正的字段)。 实参从左到右分别是arguments[0],arguments[1]...,arguments.length表示形参的个数。
//求参数的和
function getSum() {
var aLength = arguments.length;
var sum = 0;
for(var i = 0;i < aLength;i++) {
sum += arguments[i];
}
return sum;
}
console.log(getSum(1,2,3,4,5))//输出15
这里的数组直接省略,用arguments[i]表示。
6. 对象作为参数
复杂的函数一般有十多个参数。 虽然JavaScript不会检测参数的个数和类型,但是调用时形参的顺序不能乱。 开发者需要检测每个左值与数组的对应关系javascript的函数方法,效率非常低。 一个好的解决方案是使用对象作为参数,函数会根据对象的属性名称对参数进行操作。
function myFunction(obj) {
console.log(obj.name);
obj.number++;
return obj.number;
}
myObj = {name:"myObj",number:34};
myFunction(myObj);//输出myObj
console.log(myObj.number);//输出35
7. 函数对象作为另一个函数的参数
一个函数(为了方便称为函数)可以作为另一个函数(称为b函数)的参数,而b函数最终可以返回一个特定的值。
原则上,函数b在自己的函数体中调用函数a,因此需要将函数a的名称作为实参传递给函数b。 如下:
//求最大值
function getMax(a,b) {
return a>b?a:b;
}
//求最小值
function getMin(a,b) {
return a<b?a:b;
}
//下面这个函数以函数作为参数,并最终返回一个值
function getM(func,num1,num2) {
return func(num1,num2);
}
getM(getMax,1,2);//返回2
getM(getMin,1,2);//返回1
我们将函数a的名称(getMax或getMin)传递给函数b(getM()),然后在函数b内部调用传递的函数a来获取相关结果。
总结