函数可以理解为一个 特定的代码块容器 ,它可以完成特定的需求, 并且可以重复使用
函数声明和函数调用
-
函数默认不会主动执行,必须通过函数名() 调用才会执行.
-
函数一次声明可以多次调用,每一次函数调用函数体里面的代码会重新执行一次.
-
我们曾经使用的 alert() , parseInt() 这种名字后面跟小括号的本质都是函数的调用
函数传参
- 术语1: 在声明函数的小括号里面写的数值我们称之为形式参数
- 术语2: 在调用函数的小括号里面写的数值我们称之为实际参数
- 形参作用: 本质上就是在函数内部声明变量
- 实参作用: 给形参赋值
- 我们曾经使用过的 alert('打印'), parseInt('11'), Number('11') 本质上都是函数调用的传参
-
练习
- 学生的分数是一个数组,计算每个学生的总分
/*
①: 封装一个求和函数
②: 传递过去的参数是一个数组
③: 函数内部遍历数组求和
*/
function getSum(arr) {
// 箩筐思想
let sum = 0
for (let i = 0; i < arr.length; i++) {
// arr[i] 代表数组当中的每一个元素
sum = sum + arr[i]
}
document.write(sum)
}
getSum([1, 2, 3, 4, 5])
函数的返回值
-
我们使用过的返回值引出为什么需要返回值
-
使用过的返回值
- let result = prompt('请输入你的年龄?');
- let result2 = confirm('你确定要删除这条记录么?')
- let result3 = parseInt('111');
- // 函数的返回值不是必须的, 比如: alert() let result4 = alert('弹出一个内容');
-
上面都是我们使用过的函数返回值的情况. 只是这些函数是JS底层内置的.我们直接就可以使用
- 引出我们自己自定义的函数如何拥有返回值
-
介绍语法
- function doSomething(){ // doing return result; }
-
let jieguo = doSomething();
-
场景介绍
-
调用两次求和函数,得到每一次求和的结果,再比较这两个结果的大小
-
function getSum(a, b) { let sum = a + b; return sum; }
let sum1 = getSum(10, 20); let sum2 = getSum(5, 16);
let max = sum1 > sum2 ? sum1 : sum2; console.log(max);
-
-
断点调试
- f11进入函数内部
细节补充
-
两个相同的函数后面的会覆盖前面的函数
-
在Javascript中 实参的个数和形参的个数可以不一致
- 如果形参过多 会自动填上undefined (了解即可)
- 如果实参过多 那么多余的实参会被忽略 (函数内部有一个arguments,里面装着所有的实参)
-
函数一旦碰到return就不会在往下执行了 函数的结束用return
作用域
-
作用域分类
- 全局作用域:
- 函数作用域
- 块作用域:
-
变量分类
-
全局变量
- 在函数外部let 的变量 => 全局变量在任何区域都可以访问和修改
-
局部变量
- 在函数内部let 的变量 => 局部变量只能在当前函数内部访问和修改
-
块级变量
- let定义的变量,只能在块作用域里访问,不能跨块访问,也不能跨函数访问
-
- 大坑: 局部变量必须是函数里面声明过(let)的变量
-
变量访问原则
- 在能够访问到的情况下 先局部 局部没有在找全局
匿名函数
-
没有名字的函数, 无法直接使用
-
使用方式
-
将匿名函数赋值给一个变量,并且通过变量名称进行调用 我们将这个称为函数表达式
-
自执行(匿名函数自执行)
- 场景介绍: 避免全局变量之间的污染
-
时钟秒数综合案例
小时: h = parseInt(总秒数 / 60 / 60 % 24)
分钟: m = parseInt(总秒数 / 60 % 60 )
秒数: s = parseInt(总秒数 % 60)
*/
// 用户输入的秒数 转换为时分秒 不足两位补0
let times = +prompt('请您输入秒数')
function getTime(time) {
let h = parseInt(time / 60 / 60 % 24)
let m = parseInt(time / 60 % 60)
let s = parseInt(time % 60)
// 补0的操作 ctrl+d 快速选中相同的内容
h = h < 10 ? '0' + h : String(h)
m = m < 10 ? '0' + m : String(m)
s = s < 10 ? '0' + s : String(s)
// s = s < 10 ? '0' + s : s.toString()
// 不做任何处理 直接返回三个值
return [h, m, s]
}
let res = getTime(times)
console.log(res);
document.write(`您输入的秒数为${time},转换的时间为:${res[0]}:${res[1]}:${res[2]}`)