在 JS 里面,可能会定义非常多的相同代码或者功能相似的代码,这些代码可能需要大量重复使用。虽然 for循环语句也能实现一些简单的重复操作,但是比较具有局限性,此时我们就可以使用 JS 中的函数。
函数:就是封装了一段可被重复调用执行的代码块。通过此代码块可以实现大量代码的重复使用。
// 声明函数
function 函数名() {
//函数体代码
}// 调用函数
函数名(); // 通过调用函数名来执行函数体代码注意:声明函数本身并不会执行代码,只有调用函数时才会执行函数体代码。

// 1.声明函数
function getSum() {
var sum = 0;
for (var i = 1; i <= 100; i++) {
sum += i;
}
console.log(sum);
}
// 2.调用函数
getSum();
getSum();
参数的作用 : 在函数内部某些值不能固定,我们可以通过参数在调用函数时传递不同的值进去。
函数参数的运用:
// 带参数的函数声明
function 函数名(形参1, 形参2 , 形参3...) { // 可以定义任意多的参数,用逗号分隔
// 函数体
}
// 带参数的函数调用
函数名(实参1, 实参2, 实参3...); 
// 函数形参实参个数匹配
function getSum(num1, num2) {
console.log(num1 + num2);
}
// 1.如果实参的个数和形参的个数一致 则正常输出结果
getSum(1, 2);
// 2.如果实参的个数多余形参的个数,会取到形参的个数
getSum(1, 2, 3);
// 3.如果实参的个数小于形参的个数 多余的形参定义为undefind 最终的结果就是 NaN
// 形参可以看做是不用声明的变量 num2 是一个变量但是没有接受值 结果就是undefind
getSum(1); //NaN
//尽量让实参的个数和形参的个数相匹配注意:在JavaScript中,形参的默认值是undefined。
小结:
返回值:函数调用整体代表的数据;函数执行完成后可以通过return语句将指定数据返回 。// 声明函数
function 函数名(){
...
return 需要返回的值;
}
// 调用函数
函数名(); // 此时调用函数就可以得到函数体内return 后面的值return 语句之后的代码不被执行
// 1.return 终止函数
function getSum(num1, num2) {
return num1 + num2; // return后面的代码不会被执行
alert("我是不会被执行的哦");
}
console.log(getSum(1, 5));return 只能返回一个值。如果用逗号隔开多个值,以最后一个为准。
// 2.return只能返回一个值
function fn(num1, num2) {
return num1, num2; // 返回的结果是最后一个值
}
console.log(fn(1, 2));
// 3.我们求任意两个数的 加减乘除结果
function getResult(num1, num2) {
return [num1 + num2, num1 - num2, num1 * num2, num1 / num2];
}
var re = getResult(4, 5);
console.log(re);函数没有 return 返回 undefined
// 4.函数如果有返回值return则返回return后面的值,如果函数没有return则返回undefind
function fun1() {
return 666; // 返回666
}
console.log(fun1());
function fun2() {}
console.log(fun2()); //函数返回结果undefined当不确定有多少个参数传递的时候,可以用 arguments 来获取。JavaScript 中,arguments实际上它是当前函数的一个内置对象。所有函数都内置了一个 arguments 对象,arguments 对象中存储了传递的所有实参。arguments展示形式是一个伪数组,因此可以进行遍历。伪数组具有以下特点:
// arguments 的使用 只有函数才有
function fn() {
//console.log(arguments); // 里面存储了传过来的所有实参
// 可以按照数组的方式遍历arguments
for (var i = 0; i < arguments.length; i++) {
console.log(arguments[i]);
}
}
fn(1, 2, 3);注意:在函数内部使用该对象,用此对象获取函数调用时传的实参。
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, 2, 3, 4, 5]);
var arr2 = reverse(["pink", "yellow", "red"]);
console.log(arr1);
console.log(arr2);//利用函数冒泡排序
function sort(arr) {
for (var i = 0; i < arr.length; i++) {
for (var j = 0; j < arr.length - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
var temp;
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
return arr;
}
var arr1 = sort([1, 3, 2, 5, 4, 6, 7]);
console.log(arr1); 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));函数内部可以调用另一个函数,在同一作用域代码中,函数名即代表封装的操作,使用函数名加括号即可以将封装的操作执行。
// 函数是可以相互调用的
function fn1() {
console.log(11);
fn2(); //在fn1里面调用fn2
}
fn1();
function fn2() {
console.log(22);
}利用函数关键字 function 自定义函数方式
// 声明定义方式
function fn() {...}
// 调用
fn(); 利用函数表达式方式的写法如下:
// 这是函数表达式写法,匿名函数后面跟分号结束
var fn = function(){...};
// 调用的方式,函数调用必须写到函数体下面
fn();