JavaScript函数

函数概念

(1) 函数(function),也叫作功能、方法,函数可以将一段代码一起封装起来,被封装起来的函数具备某一项特殊的功能,内部封装的一段代码作为一个完整的结构体,要执行就都执行,要不执行就都不执行。

(2)函数的作用就是封装一段代码,将来可以重复使用

函数声明

(1)函数声明又叫函数定义,函数必须先定义然后才能使用

(2)如果没有定义函数直接使用,会出现一个引用错误。

(3)函数声明语法:

function 函数名(参数){
 // 封装的结构体;
}

特点:函数声明的时候,函数体并不会执行,只有当函数被调用的时候才会执行

函数调用

(1)调用方法:函数名();

(2)函数调用也叫作函数执行,调用时会将函数内部封装的所有的结构体的代码立即执行。

(3)函数内部语句执行的位置,与函数定义的位置无关,与函数调用位置有关。

(4)函数可以一次定义,多次执行

函数的参数

(1)函数预留了一个接口,专门用于让用户自定义内容,使函数发生一些执行效果变化。

(2)接口:就是函数的参数,函数参数的本质就是变量,可以接收任意类型的数据,导致函数执行结果根据参数不同,结果也不同。

(3)一个函数可以设置 0 个或者多个参数,参数之间用逗号分隔。

(4)函数的参数根据书写位置不同,名称也不同:

  • 形式参数:定义的 () 内部的参数,叫做形式参数,本质是变量,可以接收实际参数传递过来的数据。简称形参。
  • 实际参数:调用的 () 内部的参数,叫做实际参数,本质就是传递的各种类型的数据,传递给每个形参,简称实参。

(5)函数执行过程,伴随着传参的过程:

在这里插入图片描述

function getSum(num1,num2){
    console.log(num1 + num2);
}
getSum(1,2);
// 执行过程:因为前面只声明了函数,没调用,所以先略过,先执行函数调用,调用后返上去找函数声明,把实参传递给形参,然后输出

(6)函数参数的优点:

  • 不论使用自己封装的函数,还是其他人封装的函数,只需要知道传递什么参数,执行什么功能,没必要知道内部的结构什么。
  • 一般自己封装的函数或者其他人封装的函数需要有一个 API 接口说明,告诉用户参数需要传递什么类型的数据,实现什么功能。

(7)形参和实参个数不匹配的问题:

  • 若实参个数 = 形参个数,则正常输出结果
  • 若实参个数 > 形参个数时,会取到形参的个数(有几个形参就取几个实参的值)
  • 若实参格式 < 形参个数时,结果是NaN(多余的形参定义为undefined)
  • 尽量让个数相匹配,形参的默认值是undefined

函数的返回值

(1)函数能够通过参数接收数据,也能够将函数执行结果返回一个值。(函数将值返回给调用者)

(2)利用函数内部的一个 return 的关键字设置函数的返回值。

(3)返回值的作用:

  • 函数内部如果结构体执行到一个 return 的关键字,会立即停止后面代码的执行

  • 可以在 return 关键字后面添加空格,空格后面任意定义一个数据字面量或者表达式,函数在执行完自身功能之后,整体会被 return 矮化成一个表达式,表达式必须求出一个值继续可以参与程序,表达式的值就是 return 后面的数据

  • return 只能返回一个值,如果用逗号隔开多个值,以最后一个为准,若想输出多个值,用数组、对象等可变相输出

    // 求任意两数的加减乘除结果
    function getResult(a, b) {
      return [a + b, a - b, a * b, a / b];
    }
    var re = getResult(1, 2);
    console.log(re);
    

(4)应用:

  • 函数如果有返回值,执行结果可以当成普通数据参与程序。
  • 函数如果有返回值,可以作为一个普通数据赋值给一个变量,甚至赋值给其他函数的实际参数。

(5)注意:如果函数没有设置 return 语句 ,那么函数有默认的返回值 undefined;如果函数使用 return 语句,但是 return 后面没有任何值,那么函数的返回值也是 undefined。

(6)函数只是实现某种功能,最终结果需要返回给函数的调用者“函数名()”,通过return实现

// 定义一个求和函数 传入两个数据
// 参数:传两个参数 数据类型为数字
// 功能:得到两个数字之和
function sum(a, b) {
  // console.log(a + b);
  return a + b;
}
// 调用函数中 给小括号内部添加数据
sum(3, 4);
sum("3", 4);
// console.log(sum(3, 4));
// 将返回值赋值给变量
var num = sum(3, 4);
console.log(num);
// 将返回值赋值给函数的实参
console.log(sum(2, sum(3, 4)));

(7)break、continue、return的区别

  • break:结束当前的循环体
  • continue:跳出本次循环,继续执行下次的循环
  • return:不仅可以退出循环,还能返回return语句中的值,同时还可以结束当前的函数体内的代码

函数的表达式

(1)函数表达式是函数定义的另外一种方式

(2)定义方法:就是将函数的定义、匿名函数赋值给一个变量。

(3)函数定义赋值给一个变量,相当于将函数整体矮化成了一个表达式。

(4 )调用函数表达式,方法是给变量名加()执行,不能使用函数名加()执行。

(5)函数表达式声明方式跟声明变量差不多,只不过变量里存值,而函数表达式存函数;函数表达式也可以进行传递参数

// 定义一个函数表达式
var foo = function () {
  console.log(2);
};
// 调用函数式 只能用变量名调用 函数名调用不成功
foo();

函数的数据类型

(1)函数是一种单独的数据类型 Function。

(2)由于函数是一种数据类型,可以参与其他程序。

(3)可以把函数作为另一个函数的参数,在另一个函数中调用。

setInterval(function () {
	console.log(1);
}, 1000);

(4)可以把函数可以作为返回值从函数内部返回。

function fn(b) {
	var a = 10;
    return function () {
    	alert(a + b);
    };
}

arguments 对象

(1)JavaScript 中,arguments 对象是比较特别的一个对象,实际上是当前函数的一个内置属性。也就是说所有函数都内置了一个 arguments 对象,arguments 对象中存储了传递的所有的实参

(2)arguments 是一个伪数组,因此及可以进行遍历。伪数组的特点:具有length属性,按索引方式储存数据,不具有数组的push、pop等方法

案例:定义一个求和函数 如果传入 1 个参数 返回它自己 如果传入2个参数 返回他们的和 如果传入3个 先比较前两个的大小 大的与第三个参数求和返回 如果传入4个及以上 输出错误提示

function sum(a, b, c) {
	switch (arguments.length) {
	  case 1:
	    return a;
	    break;
	  case 2:
	    return a + b;
	    break;
	  case 3:
	    return a > b ? a + c : b + c;
	    break;
	  default:
	    // 提示用户 实参个数传递错误
	    // 模拟控制台报错
	    throw new Error("参数个数不能超过 3 个");
	}
}
// 调用函数
console.log(sum(1));
console.log(sum(1, 2));
console.log(sum(1, 2, 3));
console.log(sum(1, 2, 3, 4, 5));

函数递归

(1)函数内部可以通过函数名调用函数自身的方式,就是函数递归现象。

(2)递归的次数太多容易出现错误:超出计算机的计算最大能力。

(3)更多时候,使用递归去解决一些数学中的现象。例如:输出斐波那契数列的某一项的值。

案例:斐波那契数列:后面的一项数据是前两项数据之和。1,1,2,3,5,8,13,21,34,55……

function fibo(a) {
	if (a === 1 || a === 2) {
	  return 1;
	} else {
	  return fibo(a - 1) + fibo(a - 2);
	}
}
console.log(fibo(2));
console.log(fibo(10));

案例:利用函数求两个数的最大值

function getMax(a, b) {
	return a > b ? a : b;
}
console.log(getMax(1, 3));

案例:利用函数求数组中的最大数值

function getArrMax(arr) {
  var max = arr[0];
  for (var i = 1; i < arr.length; i++) {
    if (arr[i] > max) {
      max = arr[i];
    }
  }
  return max;
}
// 用一个变量来接收函数的返回结果 使用更简单
var re = getArrMax([3, 8, 66, 55, 99, 2, 0]);
console.log(re);

案例:利用函数求任意个数的最大值

function getMax() {
  var max = arguments[0];
  for (var i = 1; i < arguments.length; i++) {
    if (arguments[i] > max) {
      max = arguments[i];
    }
  }
  return max;
}
console.log(getMax(1, 3, 4));

案例:利用函数翻转任意数组

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, 4, 9, 5]);
console.log(arr1);

案例:利用函数判断闰年

function isRunYear(year) {
// 是闰年就返回true 否则返回false(必须是true和false,给之后操作提供方便)
	var flag = false;
    if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
    	flag = true;
   }
   return flag;
}
console.log(isRunYear(1999));

案例:用户输入年份,输出当前年份2月份的天数

function backDay() {
  var year = prompt("请输入年份:");
  if (isRunYear(year)) {
    alert("当前年份是闰年,2月份有29天");
  } else {
    alert("当前年份是平年,2月份有28天");
  }
}
backDay();
function isRunYear(year) {
  var flag = false;
  if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
    flag = true;
  }
  return flag;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值