js基础知识笔记二
函数基础知识
1,函数的基本格式
①函数声明:
`function 方法名/函数的名字(){
//要执行的代码
}`
②函数调用:
`//函数声明
function fn(){
console.log(1);
}
//函数的调用
fn();`
注意:在调用时,如果没有加‘()’,会返回函数的方法体。
③函数参数:
`function func(形参1,形参2){
//函数执行代码
}
func(实参1,实参2);//调用时传参`
情况一:函数的实参和形参的数量应该相同,但是JS并没有这样的要求。可以不相同
情况二:如果函数的实参数量少于形参数量,那么多出来的形参会默认会undefined
情况三:如果函数实参数量多余形参数量,那么多出来的实参就不能通过形参访问。函数忽略掉多余的实参。
④函数返回值:
四种情况:
情况一:如果函数中没有return关键字,那么函数有默认的返回值undefined (如下)
`<script>
function fn(){
}
console.log(fn());
</script>`
情况二:如果函数中有return关键字,那么这个关键字后面的代码是不会执行的 (如下)
`<script>
function fn(){
return '我被返回了';
alert('我是不会被执行的');
}
console.log(fn());
</script>`
情况三:如果函数中有retruen关键字,这个关键字后面没有值,那么这个函数有返回值是undefined (如下)
`<script>
function fn(){
return ;
}
console.log(fn());
</script>`
情况四:如果函数中有return关键字,这个关键字后面有值,那么这个值就是这个函数的返回值。 (如下)
`<script>
function fn(){
return '前端yyds';
}
console.log(fn());
</script>`
2,函数类型
①匿名函数(也可以叫做没有名字的函数)==》实际开发中用的相对较多
`var a = function(){
console.log('前端开发');
}
a();`
②具名函数
`function fn(){
console.log("一个喜欢画画的前端小猿人");
}`
③立即执行函数(又叫做IIFE)==》相比来说开发用的多,用于多个函数的封装
`(function (用于接收实参){
console.log("我是IIFE函数");
})(也可以传实参)`
关于立即执行函数的解释
IIFE作用
1,防止外部命名空间污染
2,隐藏内部代码暴露接口
3,对项目的初始化,只执行一次
IIFE特点
1,匿名函数自调用是在定义的同时执行函数
2,匿名函数自调用只能执行一次
如果需要一个函数可以执行多次,这个函数必须是有名函数
如果函数没有名字要想执行必须是自调用,但是只能执行一次
3、匿名函数自调用,函数整体不会发生预解析,但是函数内部执行代码是要去预解析
3,函数的递归
函数的递归调用,就是函数在内部自己调自己
函数的递归调用是一把双刃剑,如果设计的好,可以帮我们简单的处理事情,如果设计不好就是灾难
函数的递归要想设计好必须有两个条件
- 必须有一个明显的结束条件,不能一直递归下去
- 每一次调用都要有一个趋近结束条件的趋势
情况一(设计不好的递归):
`<script>
function fn() {
console.log('设计不好的递归');
fn();
}
fn();
</script>`
情况二( 防止递归名字被修改):
`<script>
var n = 0;
function fn() {
if (n >= 10) {
return;
}
n++;
console.log('递归部分');
//fn =1;
//fn();
arguments.callee();
}
fn();
</script>`
递归的小案例:
实现10的阶乘
`function result(n){
if(n <= 1){
return 1;
}
return n * getFactorial(n - 1);
}
console.log(result(10));`