JavaScript的函数详解
一、什么是函数
函数是一个独立的功能模块,可以重复使用,维护方便。
在编写代码时,可能会出现非常多的相同代码,或者功能类似的代码,这些代码可能需要大量重复使用,此时就可以使用JavaScript中的函数。
二、函数的使用
1、函数的声明
基本语法格式如下:
function 函数名([参数]){
函数体语句;
}
(1)‘function’:是关键字,必须小写。
(2)‘函数名’:用户标识符,建议采用驼峰命名(第一个单词是动词,后面的单词首字母大写) ,做到’见名知义’。
(3)‘参数’:函数可以有参数也可以没有参数。’()'不能省略的。
(4)’{}’:表示函数的作用范围(可写可不写)。
2、函数的调用
(1)直接调用:函数名(参数)
(2)触发事件调用:事件名 = 函数名(参数)
function getSum(a,b){
var sum = a+b;
return sum;
}
console.log('sum=',getSum(2,3));
3、函数的参数:参入运算的数据
(1)形参(形式参数)
在函数定义时出现在函数首部的参数,只是占位符,没有实际的数据
(2)实参(实在参数):
在函数调用时出现在函数首部的参数,是有确定值的变量或常量
(3)参数之间的数据传递
实参将数据传递给形参(按值传递),传递的方向是单向的(实参–>形参)
数据传递时实参和形参按从左到右一一对应匹配与名称无关
(4)参数的数量
函数的实参和形参的个数可以不同
A、实参的个数多于形参的个数:函数正常运行,多余的实参被忽略
B、实参的个数少于形参的个数: 多余的形参会变成undefined的变量
参数传递过程如下:
function swap(a,b){
console.log("形参:a="+a+",实参:b="+b);
var temp = a;
a = b;
b = temp;
console.log("形参:a="+a+",实参:b="+b);
}
var t = 10;k = 25;
console.log("实参:t="+t+",k="+k);
swap(t,k);
console.log("实参:t="+t+",k="+k);
4、函数的返回值:函数可以有返回值,也可以没有返回值。
(1)有返回值的函数:函数体中通过return语法返回一个值,这个决定程序下一步操作
(2)无返回值的函数:函数只实现某种功能,不需要返回值(函数体中没有return语句)
三、arguments的使用
当不确定函数中接收到了多少个实参的时候,可以用arguments来获取实参。这是因为arguments是当前函数的一个内置对象,所有函数都内置了一个arguments对象,该对象保存了函数调用时传递的所有的实参。
function fn() {
console.log(arguments); // 输出结果:Arguments(3) [1, 2, 3, …]
console.log(arguments.length); // 输出结果:3
console.log(arguments[1]); // 输出结果:2
}
fn(1, 2, 3);
四、函数进阶
1、函数表达式
是将声明的函数赋值给一个变量,通过变量完成函数的调用和参数的传递,函数表达式的定义必须在调用前。
var sum = function(num1, num2) { // 函数表达式
return num1 + num2;
};
console.log(sum(1, 2)); // 调用函数,输出结果:3
2、回调函数
指的就是一个函数A作为参数传递给一个函数B,然后在B的函数体内调用函数A。此时,称函数A为回调函数。
例如:
function cal(num1, num2, fn) {
return fn(num1, num2);
}
console.log(cal(45, 55, function (a, b) {
return a + b;
}));
3、递归调用
指的是一个函数在其函数体内调用自身的过程,这种函数称为递归函数。以根据用户的输入计算指定数据的阶乘为例进行讲解:
(1)什么是递归:函数自己调用自己
(2)用递归解决问题条件
A、问题可以分解,分解后得到的新问题的解法与原问题的解法相同
B、分解的过程要有明确的结束条件
(3)递归的过程:
A、自上而下分解问题:5!
5!-->5*4!
4! -->4*3!
3!-->3*2!
2!-->2*1!
B、自下而上回溯得到问题的解
1!-->2!-->3!-->4!-->5!
JavaScript代码实现如下:
function factorial(n) { // 定义回调函数
if (n == 1) { return 1; }// 递归出
return n * factorial(n - 1);
}
var n = prompt('求n的阶乘\n n是大于等于1的正整数,如2表示求2!。');
n = parseInt(n);
if (isNaN(n))
{ console.log('输入的n值不合法') }
else { console.log(n + '的阶乘为:' + factorial(n));
}