什么是函数
说明
就是封装了一段可被重复调用执行的代码块。通过此代码块可以实现大量代码的重复使用。
优点
- 函数具有“一次定义,多次调用”的优点
- 使用函数,可以简化问题,让代码更具有可读性
函数的定义和调用
声明函数
- function是声明函数的关键字
- 函数是做某件事情,所以函数名一般是动词( 前缀应该为动词 )。
- 函数不调用自己不执行, 使用 () 调用函数
第一种
利用函数关键字命名函数
function 函数名() {}
第二种 函数表达式
- 变量名是变量名,不是函数名
- 跟声明变量差不多,只不过声明函数里面存的是函数
- 函数表达式可以参数
let 变量名 = function() {}
调用函数
函数名();
函数的封装
说明
就是把一个或多个功能通过函数的方式封装起来,对外只提供一个简单的函数接口。
函数传参
说明
- 若函数完成功能需要调用者传入数据,那么就需要用有参数的函数
- 这样可以极大提高函数的灵活性
- 形参: 声明函数时写在函数名右边小括号里的叫形参(形式上的参数)
- 实参:调用函数时写在函数名右边小括号里的叫实参(实际上的参数)
function 函数名(参数列表) { //传入数据列表 声明这个函数需要传入几个数据,多个数据用逗号隔开
函数体
}
作用
在函数内部某些值不能固定,可以通过参数再调用函数时传递不同的值进去
注意
- 在函数名调用的括号里面是实参
- 形参是接受实参的
- 函数的参数可有可无
形参的默认值是undefined
- 尽量让实参的个数和形参的个数相匹配
- 形参也可以看作是变量
形参与实参的匹配问题
| 参数个数 | 结果 | | —- | —- | | 实参 = 形参 | 正确输出结果 | | 形参 < 实参 | 报错,未定义 | | 实参 < 形参 | 多的形参定义为undefined,undefined进行任何运算结果都是NaN |
函数的返回值
说明
- 利用return终止函数,return后面的语句不会再执行。
- 简单来说: 函数内部不需要 输出结果,而是返回结果
- 在函数中使用return时,return只能返回一个值。当需要返回多个值,可以使用数组来实现。
- 不能执行多个return,只有第一个return生效
- 在函数体中使用 return 关键字能将内部的执行结果交给函数外部使用
- 函数可以没有 return,这种情况函数默认返回值为 undefined
- 函数有return必须要用变量来接收,再输出
匿名函数
函数可以分为 具名函数 和 匿名函数
//具名函数
声明:function fn() {}
调用:fn()
//匿名函数
function() {}
说明
将匿名函数**赋值给一个变量**,并且**通过变量名称进行调用**我们将这个称为**函数表达式** 。
写法
let fn = function () {}
//调用
fn() //函数名()
立即执行函数
避免全局变量之间的污染
不需要调用立即执行
多个立即执行函数要用分号(;)隔开,不然会报错
语法
方式一
(function () {console.log(2) })()
方式二
(function () {console.log(2) }())
JS作用域
说明
- 通常来说,一段程序代码中所用到的名字并不总是有效和可用的,而限定这个名字的可用性的代码范围就是这 个名字的作用域。
- 作用的使用提高了程序逻辑的局部性,增强了程序的可靠性,减少了名字冲突。
全局作用域
全局有效
作用于所有代码执行的 环境(整个 script 标签 内部)或者一个独立的 js 文件
局部作用域
局部有效
作用于函数内的代码环境,就是局部作用域。
因为跟函数有关系,所以也称为函数作用域。
块级作用域
{} 内有效
块作用域由 { } 包括,if语 句和for语句里面的{ }等 。
变量的作用域
如果函数内部或者块级作用域内部,变量没有声明,直接赋值,也当全局变量看,但是强烈不推荐 但是有一种情况,函数内部的形参可以看做是局部变量。
全局变量
函数外部let 的变量
。
在任何区域都可以访问和修改
局部变量
函数内部let的变量
。
局部变量只能在当前函 数内部访问和修改
块级变量
{} 内部的let变量
。
let定义的变量,只能在块作用域里访问,不能跨块访问,也不能跨函数访问
作用域链
函数内部访问外部函数的变量,采用的是链式查找的方法决定取哪个值(就近原则)。
案例
//用户输入秒数,获得指定格式,个位数前面补0
function getTime() {
// 用户输入秒数
let seconds = +prompt("请输入秒数");
// 获取时
let h = parseInt(seconds / 60 / 60 % 24);
// 获取分
let m = parseInt(seconds / 60 % 60);
// 获取秒
let s = parseInt(seconds % 60);
// 补零
h = h < 10 ? '0' + h : h;
m = m < 10 ? '0' + m : m;
s = s < 10 ? '0' + s : s;
console.log(`${seconds}秒等于${h}时${m}分${s}秒`); //假设总秒数为1000秒,输出 1000秒等于00时16分40秒
}
getTime() //1000秒等于00时16分40秒