1. 函数的概念
1.1 什么是函数
函数具有某种特定功能的代码块。
函数其实本质也是一种数据,属于对象数据类型。
1.2 为什么要有函数
1)解决代码的冗余问题,形成代码复用。
2)可以把整个代码项目,通过函数模块化。
3) 封装代码,让函数内部的代码对外部不可见。
2. 函数的组成
函数的声明:
函数的调用:
函数由如下部分组成:
} function 函数名(参数) {
}
- 表达式方式```htmlvar 函数名 = function(){}var 函数名 = function(参数) {}
- Function构造函数方式
var 函数名 = new Function('函数体');var 函数名 = new Function('参数', '函数体')
4 函数调用
1) 在函数名后面加上 () 就是对函数的调用,函数内的代码会执行。
2) 函数名后面不加() 不会调用函数,函数内的代码也不会执行;函数名本质上是个变量名,通过函数名可以引用到函数本身。5 函数的返回值
5.1 返回值
1)函数名() 被称之为函数调用表达式, 表表达式的值就是函数的返回值。
2)在函数体内,return 右边的表达式(或变量、直接量)便是函数的返回值。
3)函数体内没写 return 或者 return 的右边是空的,默认默认会返回 undefined。
4)return 除了设置返回值外,还可以结束函数的执行,return 之后的代码不会执行。5.2 那些函数需要些返回值
什么样的函数需要写返回值?
如果函数的作用是进行某种计算,得到的计算结果最后以返回值的形式返回。
什么样的函数不需要返回值?
函数的功能是实现某个具体的操作(界面操作),无需返回值。6 函数的参数
6.1 形参和实参
形参: 声明函数的时候,给的参数, 类似于变量名;在声明函数的时候,参数是没有值。
实参:调用函数是给的参数; 实参会按照顺序赋值给形参。6.2 形参和实参的数量问题
正常情况下,实参数量应该等于形参数量。
如果实参数量大于形参数量, 多出来的实参,将被忽略。
如果实参数量小于形参数量, 有的形参没有对应的实参,取默认值 undefined。6.3 形参的默认值
JS函数允许形参有默认值,有默认值的形参,在调用函数的时候,可以没有与之对应的实参!
如何实现形参的默认值?
es6才可以这么写,那问题来了,如果es6前应该怎么去设置默认值function demo(a, b=默认值) { }注意: 有默认值的形参一定要放在后面!

6.4 arguments
arguments 只能在函数内使用。
arguments 是一个类数组对象,具有数组的一些特性。
arguments可以获取所有的实参,所以我们想获取实参的话有两种方式:①用形参;②使用arguments。
用途:如计算所有参数和,取参数中的最大值,取参数中的最小值,求所有参数平均数。
/*** 取所有参数里面的最大值*/function max() {//设置遍历 默认值的最大值var res = arguments[0];// 循环比较for (var i = 0; i < arguments.length; i ++) {if (arguments[i] > res) {res = arguments[i];}}// 返回结果return res;}/*** 取所有参数里面的最小值*/function min() {var res = arguments[0];// 循环比较for (var i = 0; i < arguments.length; i ++) {if (arguments[i] < res) {res = arguments[i];}}// 返回结果return res;}
/*** 取所有参数的和*/function total() {var res = 0;for (var i = 0; i < arguments.length; i++) {res += arguments[i];}return res}console.log(total(1, 2, 3, 4, 5))/*** 取所有参数的平均数*/function average() {var res = 0, ave = 0;for (var i = 0; i < arguments.length; i++) {res += arguments[i];}ave = res / arguments.length;return ave}console.log(average(1, 1, 4));
7 函数的嵌套
函数体内是可以再嵌套函数的。
8 自调用函数 IIFE(Immediately Invoked Function Expression)
8.1 匿名函数
没有名字的函数称之为 匿名函数。
function() {//匿名函数}
8.2 自调用函数
函数声明完立即调用,称之为自调用函数,也叫立即调用函数,英文简称 IIFE,英文全称 Immediately Invoked Function Expression。
// 函数允许匿名,但是匿名的函数要立即使用// 自调用函数,立即调用函数(function(){console.log('哈哈哈,我被调用了');})();// 自调用函数 传参(function(a, b){console.log(a+'和'+b+'跳舞');})('曹操', '刘姥姥');// 当然不匿名的自调用函数也是可以的,不过没有意义(function fn(){console.log('fn 被调用了');})();(function(){})();~function(){}();+function(){}();-function(){}();!function(){}();
注意:
两个连续的自调用函数,之间必须加分号,告诉浏览器是不同的函数,否则会有语法错误。
或者,在后面的自调用函数前加 ! 等没有副作用的一元运算符。
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>函数的练习</title></head><body><button id="red">红色</button><button id="green">绿色</button><button id="blue">蓝色</button><button id="pink">粉色</button><script>/** 当点击不同的按钮的时候 让页面加载相应的颜色* 改变屏幕的颜色 就是控制body的背景颜色*/var oBody=document.getElementsByTagName("body")[0];var oRed = document.getElementById("red");var oGreen = document.getElementById("green");var oBlue = document.getElementById("blue");var oPink = document.getElementById("pink");function changeColor(col){oBody.style.backgroundColor = col;}oRed.onclick=function () {changeColor("red");}oGreen.onclick=function () {changeColor("green");}oBlue.onclick=function () {changeColor("blue");}oPink.onclick=function () {changeColor("pink");}</script></body></html>
