一、函数
所谓函数就是在程序中封装好的语句。
1、定义:有三种定义方式,声明式定义【函数关键字】、表达式【函数字面量】与构造函数
声明式:
function 函数名(参数1,参数2...){
执行语句
}
表达式:
let sum = function(){
执行语句
}
构造函数:
function add(name,age){
this.name = name;
this.age = age;
}
let add = new add('li',20);
ps:定义函数时,所用函数中的语句是不执行的;定义函数时,形参前面不需要类型,如var、let,因为在函数内部会隐式定义形参中需要的变量。
调用格式:函数名() 如:sum()
函数的作用:
-
用于重复调用的语句,在需要的时候可以直接调用
-
可以通过参数改变结果
-
把复杂的语句进行分割,方便阅读与修改
2、参数
函数的参数分为形参与实参,在函数调用使用的参数是实参,定义函数时使用的参数是形参
如:sum(12,20) // 12与20是实参
ps:js在函数调动时,形参与实参的个数可以不一致
function test(a,b){ console.log(a,b) //1 2 } test(1,2,3)
从上面我们可以看到,虽然实参的个数会多于形参的个数,表示形参与实参个数不一样,并不会报错,它会按照顺序一个一个赋值给形参,若形参多于实参,没被赋值的默认为undefined。 那么我们如果想要获取 3 的值,该怎么获得呢? 其实很简单,js中的函数,在传递参数的时候,内部会构建一个arguments数组,用于存储从函数实参中传递过来的值,该数组中的值会与形参列表相对应,构成映射关系,修改一边的值,另一边也会修改。 如: arguments[0]=>a , arguments[1]=>b , arguments[2] => 3
arguments[1] = 5; //执行该语句后,arguments[1]与b的值均为 5
arguments 对应实参列表,arguments.length //实参列表的个数 ,该例子为3
定义函数时,函数的参数,对应形参列表 ,如test.length // 形参列表的个数,该例子为2
3、return
return使用的场景:用于终止函数;提供函数返回值。
二、递归
递归:调用自己本身的函数;
递归总结出来,就两点:找规律;找出口
找规律:相当于数学中的数学公式,通过一定的规律,使用公式表示。
找出口:结束条件,相当于最明显、已知的条件。
使用递归最普遍的例子:阶乘 与 斐波那契数列
1、阶乘:
首先以阶乘为例:容易得出,通过规律,可将求阶乘用公式表示: f(n) = n *(n-1)! , 0!=1, 1!=1
然后我们可以得出 0!=1,1!=1,两者都是很明显的一个已知条件,最后我们便可以得出下面:
function factorial(n){
if(n == 1 || n == 0){
return 1; //出口
}
return n * factorial(n-1);
}
2、斐波那契数列:
通过规律得出公式 :f(n) = f(n-1) + f(n-2) n>=3 f(1) = 1; f(2) = 1;
所以可以得出:
function fib(n){
if(n == 1 || n == 2){
return 1; //出口
}
return fib(n-1)+fib(n-2);
}
以上文字均为自己在学习时的总结 ,如有错误,或表述不对的地方,请多包涵,ps:可以在评论区交流哟!