1.什么是函数?
函数是一个可以重复使用的程序模块,该程序模块可以完成一个特定的功能
2.函数的定义
function 函数名(【参数】]){
函数体语句
}
(1)function:是关键字,必须小写
(2)函数名:用户标识符(用户自定义)—- 建议:见名知意
(3)【参数】:’()’不能省略,’参数’是可选的(函数可以有参数,也可以没有参数)
(4)’{}’:不能省略,表示函数的控制范围
(5)’函数体语句’:实现功能的代码
3.函数的调用
(1)带返回值的函数(函数体中有return语句的函数):
let / var 变量 = 函数名(【参数】)
注意:关于函数的返回值
a.函数是否要返回值由具体的需求决定
b.函数返回值通过return语句来完成。在函数中一旦执行了return语句,当前函数就结束运行
(2)无返回值的函数调用:
函数名(【参数】)
4.函数的参数
函数在运行时需要外部的数据才是实现具体的功能。这个外部的数据就是参数
1)形参:形式参数,是在函数定义时出现在函数首部的参数。形参没有实际值,只是一个占位符
2)实参:实在参数。是函数调用时出现在函数首部的参数,实参表示的是一个实际值
练习:定义一个函数,用来判断一个数是否是素数,若是素数返回true,若不是返回false
//定义函数:判断一个数是否是素数
function isPrime(n){ //n是形参
// let flag = true //假设n是素数
for(let i=2;i
3)在函数调用时,参数的传递方向是实参—->形参(传递方向是单向的,当形参发生改变后不会影响实参)
//参数传递方向是单向的:实参--->形参
function swap(x,y){//两个形参,参数之间用逗号分隔
console.log('形参:x='+x+',y='+y)
let temp = x
x = y
y = temp
console.log('形参:x='+x+',y='+y)
}
let a = 5,b = 6
console.log('实参:a='+a+',b='+b)
swap(a,b)
console.log('实参:a='+a+',b='+b)
函数参数的数量:在javascript中允许函数的形参与实参不同
1)实参的数量多于形参的数量:函数可以正常运行,多余的实参被忽略
2)实参的数量少于形参的数量:多出的形参是一个已声明未赋值的变量,它的值是undefined
5. arguments对象的使用
内置对象:已经定好的,用户只要使用即可
封装实参的对象: arguments。调用函数时,函数的实参都保存在arguments对象中
arguments是一个类数组对象,它也可以通过索引来操作数据,也可以获取长度,在调用函数时,我们所传递的实参都会在arguments中保存,比如:arguments.length 可以用来获取实参的长度,我们即使不定义形参,也可以通过arguments来使用实参,例如:
arguments[0]:表示第一个实参
arguments[1]:表示第二个实参
…
有一个属性叫做callee,这个属性对应一个函数对象,就是当前正在指向的函数的对象
function fun(a, b) {
// 通过下标获取第一个参数
console.log(arguments[0]);
// 通过下标获取第二个参数
console.log(arguments[1]);
// 获取实参的个数
console.log(arguments.length);
// 看看它的函数对象
console.log(arguments.callee);
console.log(arguments.callee == fun);
}
fun("Hello", "World");
练习:定义一个函数,返回调用该函数时实参的最大值
function getMax(){
let max = arguments[0] //假设第一个实参是最大的
for(let i=1;i
强调:每个函数内部都有一个arguments对象,本质是一个数组,保存的是调用函数时传递的实参
6.函数的递归调用(重点、难点)
(1)递归调用:函数自己调用自己(即在函数的函数体语句中调用自己)
(2)递归算法:
1)用递归方式解决问题的前提
a.问题可以进行分解,分解得到的新问题的解法与原问题的解法相同
8! —> 8 7! —->7 6!—>…….2!—>2 1!
b.问题的分解过程必须有明确的结束条件
2)递归的过程
a.自上而下分解问题:得到最简单的问题的解
b.自下而上回溯得到原问题的解
练习:用递归函数计算 n!
function fun(n){
//1.明确递归结束的条件
if(n==1){
return 1
}else{
//2.继续分解n
return n * fun(n-1) //函数自己调用自己:在调用过程分解问题
}
}
let m = fun(5)
console.log('5!=',m)