函数
1 函数的概念
在JS里面 , 可能会定义非常多的相同代码或者功能相似的代码,这些代码可能需要大量重复使用。 虽然for循环语句也能实现一些简单的重复操作.但是比较具有**局限性 ** , 此时我们就可以使用JS中的函数。
函数 : 就是封装了一段可被重复调用执行的代码块。通过此代码块可以实现大量代码的重复使用(目的)。
eg
function getSum(num1,num2) {
var sum = 0;
for(var i = num1; i <= num2; i++ ) {
sum += i;
}
console.log(sum);
}
getSum(1,100);
getSum(1,1000);
2 函数的使用
step
1 声明函数 2 调用函数
2.1 声明函数
function 函数名() {
}
- 声明函数 function 关键字 小写
- 函数是做某件事情 函数名是一般动词 比如sayhi
2.2 调用函数
函数名();
- 调用函数千万不要忘记加小括号
- 函数不调用 自己不执行
注意:函数本谁并不会执行代码,只有调用函数才会执行函数体代码
eg (下面代码不规范,不能运行,只是一个样式加一个例子形式)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
function 函数名() {
}
function sayhi() {
console.log('hi');
}
函数名();
sayhi();
</script>
</body>
</html>
2.3 函数的封装
- 函数的封装是把一个或者多个功能通过函数的方式封装起来, 对外只提供一个简单的函数接口
- 简单理解:封装类似于将电脑配件整合组装到机箱中(类似快递打包)
案例:利用函数计算1~100之间的累加和
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
function getSum() {
var sum = 0;
for(var i = 1; i <= 100; i++){
sum += i;
}
console.log(sum);
}
getSum();
</script>
</body>
</html>
3 函数的参数
3.1 形参和实参
在声明函数时,可以在函数名称后面的小括号中添加一些参数,这些称为形参
在调用函数时,同时也需要传递相同的参数,称为实参
参数 | 说明 |
---|
形参 | 形式上的参数函数定义的时候传递的参数当前并不知道是什么 | 实参 | 实际上的参数函数调用的时候传递的参数实参是传递给形参的 |
参数的作用:在函数内部某些值不能固定,可以通过参数在调用函数时传递不同的值进去
function cook() {
console.log('算拉提都死');
}
cook();
function 函数名(形参1,形参2...) {
的参数)
}
函数名(实参1,实参2...);
function cook(aru) {
个变量
console.log(aru);
}
cook('酸辣土豆丝');
案例:求两个数之间的和
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
function getSum(num1,num2) {
var sum = 0;
for(var i = num1; i <= num2; i++){
sum += i;
}
console.log(sum);
}
getSum(1,100);
getSum(3,8);
</script>
</body>
</html>
注意:多个参数逗号隔开,形参可以看做是不用声明的变量
3.2 函数形参和实参个数不匹配问题
参数个数 | 说明 |
---|
实参个等于形参个数 | 输出正确结果 | 实参个数多于形参个数 | 只取到形参的个数 | 实参个数小于形参个数 | 多的形参定义为undefined,结果为NaN |
function getSum(num1,num2) {
console.log(num1 + num2);
}
getSum(1,2);
getSum(1,2,3);
getSum(1);
3.3 小结
- 函数可以带参数也可以不带参数
- 声明函数的时候,函数名括号里面的是形参, 形参的默认值为undefined
- 调用函数的时候,函数名括号里面的是实参
- 多个参数中间用逗号分隔
- 形参的个数可以和实参个数不匹配,但是结果不可预计,我们尽量要匹配
4 函数的返回值
4.1 return 语句
希望函数将值返回给调用者,可以通过return语句
function cook(aru) {
console.log(aru);
}
cook('大肘子');
function 函数名() {
return 需要返回的结果;
}
函数名();
return实现
果
function getReasult() {
return 666;
}
getReasult();
console.log(getResult());
function cook(aru) {
return aru;
}
console.log(cook('大肘子'));
function getSum(num1,num2) {
return num1 + num2;
}
console.log(getSum(2,3));
案例1:利用函数求两个数的最大值
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
function getMAx(num1,num2) {
return num1 > num2 ? num1 : num2;
}
console.log(getMAx(2,3));
</script>
</body>
</html>
案例2:利用函数求任意一个数组中的最大值
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
function getMAx(arr) {
var max = arr[0];
for(var i = 0; i < arr.length; i++){
if(arr[i] > max){
max = arr[i];
}
}
return max;
}
var re = getMAx([5,2,99,101,67,77]);
console.log(re);
</script>
</body>
</html>
4.2 return 终止函数
return语句之后的代码不会被执行
function getSum(num1,num2) {
return num1 + num2;
alert('我是不会被执行的哦!');
}
console.log(getSum(1,2));
4.3 return 返回值
1 return 只能返回一个值 如果用逗号隔开多个值,以最后一个为准
function fn(num1,num2) {
return num1,num2;
}
2 如果想返回多个值,可以存在数组里面,数组可以存放多个结果
function getResult(num1,num2) {
return [num1+num2, num1-num2, num1*num2; num1/num2];
}
var re = getResult(1,2);
console.log(re);
4.4 函数没有return 返回 undefined
函数都有返回值
- 如果函数有return 返回 return 后面的值
- 如果函数后面没有 return 则返回 undefined
function fun1() {
return 666;
}
console.log(fun1());
function fun2() {
}
console.log(fun2());
4.5 break ,continue ,return 的区别
- break : 结束当前的循环体(如for、while )
- continue : 跳出本次循环,继续执行下次循环(如for. while )
- return :不仅可以退出循环,还能够返回return语句中的值, 同时还可以结束当前的函数体内的代码
5 通过榨汁机看透函数
6 arguments的使用
- 当我们不确定有多少个参数传递的时候, 可以用arguments来获取。
- arguments是当前函数的一个内置对象
- 所有函数都内置了一个arguments对象, arguments对象中存储了传递的所有实参。
eg arguments的使用.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
function fn() {
for(var i = 0; i < arguments.length; i++) {
console.log(arguments[i]);
}
}
fn(1,2,3);
fn(1,2,3,4,5);
</script>
</body>
</html>
案例:利用函数求任意个数的最大值
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
function getMax() {
var max = arguments[0];
for(var i = 1; i < arguments.length; i++) {
if(max < arguments[i]){
max = arguments[i];
}
}
return max;
}
console.log(getMax(1,2,3));
console.log(getMax(1,2,31,4));
console.log(getMax(1,22,7,3));
console.log(getMax(1,2,3,6,7,8));
</script>
</body>
</html>
7 函数案例
目前对直接使用数组和arguments的使用有点混淆
案例1:利用函数封装方式,翻转任意一个数组
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
function reverse(arr) {
var newArr = [];
for(var i = arr.length - 1; i >= 0; i--){
newArr[newArr.length] = arr[i];
}
return newArr;
}
var arr1 = reverse([1,3,4,5,6,7]);
console.log(arr1);
var arr2 = console.log(reverse(['red','pink','blue']));
</script>
</body>
</html>
案例2:利用函数封装方式,对数组排序—冒泡排序
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
function fn(arr){
for(var i = 0; i < arr.length; i++) {
for(var j = 0; j < arr.length - i; j++) {
if (arr[j] > arr[j+1]) {
var temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
return arr;
}
var arr1 = fn([1,4,3,2,8,9]);
console.log(arr1);
var arr1 = fn([1,42,33,25,81,9]);
console.log(arr1);
</script>
</body>
</html>
案例3: 判断闰年
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
function isRunYear(year) {
var flag = false;
if(year % 4 == 0 && year % 100 !=0 || year % 400 == 0) {
flag = true;
}
return flag;
}
console.log(isRunYear(2000));
console.log(isRunYear(1999));
</script>
</body>
</html>
函数可以调用另外一个函数
每个函数是独立的代码块,因此,经常会用到函数互相调用的情况
eg:
程序执行思路: 先从上往下依次执行,执行fn1这个函数,但是没有调用所以不执行,之后执行fn1,调用,然后回头取执行fn1函数,打印11,调用fn2,再去执行fn2,打印22
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
function fn1() {
console.log(11);
fn2();
}
fn1();
function fn2() {
console.log(22);
}
</script>
</body>
</html>
案例4:用户输入年份,输出当前年份2月份的天数
7 函数两种声明方式
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
function fn() {
}
fn();
var fun = function(aru) {
console.log('我是函数表达式');
console.log(aru);
}
fun('pink');
</script>
</body>
</html>
|