函数
1 函数的概念引入
希望某些逻辑或者特定功能的代码块可以被我们控制或者反复使用,此时可以考虑用函数封装。最大好处是提高代码复用。
- 可以对某些逻辑或者功能封装
- 将来可以被控制,可以反复使用
2 函数定义
- 调用和定义谁在先都可以
function 函数名() {
// 函数体——具体代码
}
- 函数表达式 必须先定义后调用
var 函数名 = function () {
// 函数体
};
3 函数调用
函数名();
。函数定义完自己不会执行,需要去调用。
4 函数参数
函数定义时指定的参数叫形式参数,简称形参。多个形参之间用逗号隔开。函数调用的时候传入的参数叫实际参数,简称实参。
例:
function getSum(a, b) {
// a b形参
console.log(a + b);
}
getSum(10, 20); //实参
5 函数:arguments
函数内置一个对象 arguments 接受我们所有的实参。
// 函数内置一个对象 arguments 接受我们所有的实参
// arguments.length 表示实参个数
// arguments.callee 表示arguments所在的函数
// 函数名.length 表示函数形参个数
function getSum(a, b) {
// console.log(arguments);
// console.log(arguments.length);
// console.log(arguments.callee);
// console.log(getSum.length);
if (arguments.length === getSum.length) {
// console.log(a+b);
console.log(arguments[0] + arguments[1]);
} else {
alert("抱歉,传递的参数个数不匹配");
}
}
拓展 —— 实现求任意数的和:
// 实现求任意数的和
function getSum2() {
// 对arguments
var sum = 0;
for (var i = 0; i < arguments.length; i++) {
sum += arguments[i];
}
console.log(sum);
}
getSum2(1);
getSum2(2, 5);
getSum2(23, 45, 56);
getSum2(10, 20, 30, 40);
6 函数:return 关键字
return
用于返回值return
一旦执行,后面的代码不会执行return;
此时 return 结束函数调用
7 函数递归
函数自己调用自己
1、求 n 的阶乘
//普通方法
function fnFac(n) {
var res = 1;
for (var i = 1; i <= n; i++) {
res = res * i;
}
return res;
}
//递归方法
function fnFac(n) {
if (n === 1) {
// 递归结束条件
return 1;
} else {
return n * fnFac(n - 1); // 函数中调用自己
}
}
2、用递归求 100 以内所有偶数和
//递归
function evenSum(num) {
if (num === 2) {
return 2;
} else {
return num + evenSum(num - 2);
}
}
console.log(evenSum(100));
3、斐波那契数列
0 1 1 2 3 …第 n 个数等于前两个数字之和
function fiborila(n) {
if (n === 1) {
return 0;
} else if (n === 2) {
return 1;
} else {
return fiborila(n - 1) + fiborila(n - 2);
}
}
函数相关知识拓展
将函数的实际参数转换成数组的方法
方法一:var args = Array.prototype.slice.call(arguments);
方法二:var args = [].slice.call(arguments, 0);
方法三:
var args = [];
for (var i = 1; i < arguments.length; i++) {
args.push(arguments[i]);
}
转成数组的通用函数
var toArray = function (s) {
try {
return Array.prototype.slice.call(s);
} catch (e) {
var arr = [];
for (var i = 0, len = s.length; i < len; i++) {
//arr.push(s[i]);
arr[i] = s[i]; //据说这样比push快
}
return arr;
}
};