函数
一、为什么需要函数?
函数:function,是被设置执行特定任务的代码块(一坨代码)
本质:把相似逻辑代码封装起来,精简代码方便复用
二、函数的使用
思考:如果想要获取多个不同数组中的最大值,要怎么做? 使用函数 (代码复用)
老师演示
<script>
let arr1 = [1, 3, 2, 66, 33, 22];
let arr2 = [1, 3, 2, 663, 33, 22];
let arr3 = [1, 3, 2, 665, 33, 22];
let max1 = getMax(arr1);
let max2 = getMax(arr2);
let max3 = getMax(arr3);
console.log(max1, max2, max3);
function getMax(arr) {
let max = arr[0];
for (let index = 0; index < arr.length; index++) {
if (arr[index] > max) {
max = arr[index];
}
}
return max;
}
</script>
函数:function,是被设计执行特定任务的代码块
本质:函数其实就是把类似的逻辑编程代码 包裹起来,谁要用的时候直接拿出来。
有利于精简代码 方便复用
1.函数的声明
代码:
<script>
function sayHi () {
document.write(`你好啊兄DEI`)
}
</script>
注意点:
关于函数名的命名规范
1.尽量小驼峰式命名法
2.前缀应该为动词
JS中常用动词组
2.函数的调用
注意点:当声明一个函数,必须要调用才会真正执行,不调用只声明是不执行的
代码:
<script>
//声明了一个叫sayHi的函数
function sayHi () {
//这里就是函数体,将相似代码包裹,知道调用就执行
document.write(`你好啊兄DEI`)
}
//调用了叫sayHi的函数
sayHi()
</script>
知识拓展:alert()等我们之前学过的带小括号的,本质都是函数的调用。软件中自带封装了此类代码。
函数案例:
代码:
<script>
function sum99 () {
for (let col = 1; col <= 9; col++) {
for (let row = 1; row <= col; row++) {
sum = row * col
document.write(`${row}*${col}=${sum}`)
}
document.write(`<br>`)
}
}
sum99 ()
sum99 ()
sum99 ()
</script>
函数案例:
<script>
function sum1() {
let a = 1
let b = 2
let sum = a + b
console.log(sum)
}
function sum2() {
let sum = 0
for (let index = 1; index <= 100; index++) {
sum += index
}
console.log(sum)
}
sum1()
sum2()
</script>
思考:这样写是不是有什么缺陷?
问题:不能灵活输入数值,当需求不同仍需修改。不够优雅
解决方法:学习函数传参
三、函数传参
作用:当需要用户输入传入数据,就需要有参数的函数,能极大提高函数灵活性。
1.参数函数的声明:
代码:
<script>
function getSum(num1,num2) {
document.write(num1+num2)
}
</script>
2.参数函数的调用:
调用语法:
代码:
<script>
// 两个参数,可以理解为声明了两个变量
function getSum(num1,num2) {
document.write(num1+num2)
}
// 给变量赋值
getSum(10,20)
</script>
注意点:参数可以写无数个,需要传入几个就写几个
3.形参和实参
形参:指的是写在函数名小括号内的声明的变量 叫做形参
实参: 最后赋值变量的值 叫做实参
注意点:开发中注意 形参和实参数量保持一致!
例如:alert(``)在里面打印的内容其实就是调用了传参
传参案例:
代码:
<script>
let arr1 = [1,3,4,2,22]
let arr2 = [3,2,3,3,4,55]
// 函数声明 形参只是自己给的一个名字
function calSum(arr) {
let sum = 0
// 函数体 想要实现的需求内容
for (let index = 0; index < arr.length; index++) {
sum += arr[index]
}
document.write(`${sum}<br>`)
}
// 调用函数 相当于给上边参数 赋值代码
calSum(arr1)
calSum(arr2)
</script>
传参案例:求数组最大值
<script>
let arr = [1,5645,678,8,13]
function getMax(arr) {
let max = arr[0]
for (let index = 0; index < arr.length; index++) {
if (arr[index]>max){
max = arr[index]
}
}
document.write(`最大值为${max}<br>`)
}
getMax(arr)
getMax([1,6,7,567,123,12,3])
</script>
传参案例:求数组奇数和
<script>
let arr = [1,3,4,5,7,10]
function geaSum(arr) {
let sum = 0
for (let index = 0; index < arr.length; index++) {
if(arr[index]%2 !== 0) {
sum += arr[index]
}
}
document.write(sum)
}
geaSum(arr)
</script>
四、函数返回值
思考(回想):为什么要让函数有返回值?什么是函数?
函数是执行特定任务的代码块,那么执行完任务之后要把任务交给我们。就叫函数返回值
本质:当调用某一个函数时,会返回一个结果。(返回用户输入的内容 调用和函数,函数执行了任务 然后返回给我们的值就叫返回值)
语法:return 数据
1.为什么要有返回值?
如上图,这些其实也都是叫做返回值,只不过是JS内部自己封装好的一些代码,我们可以直接使用。
一句话说就是函数内部不要输出结果,而是返回一个结果,由函数外部来输出。
特点:拓展性更高,可以让其他程序使用这个代码
2.使用场景
当我想让值通过不同方法返回时
代码:
<script>
function getMax(n1,n2) {
if(n1>n2){
// 用返回值,就不会写死代码。
return n1
}else {
return n2
}
}
console.log(getMax(3,2))
alert(getMax(6,3))
</script>
返回值案例 求最值 并且函数外部输出
<script>
let arr1 = [1,3,4,33,22]
function getMax(arr) {
let max = arr[0]
for (let index = 0; index < arr.length; index++) {
if(arr[index]>max){
max=arr[index]
}
}
return max
}
let max = getMax(arr1)
console.log(max)
function getMin(arr) {
let min = arr[0]
for (let index = 0; index < arr.length; index++) {
if(arr[index]<min){
min=arr[index]
}
}
return min
}
let min = getMin(arr1)
console.log(min)
</script>
细节:
1.在函数体中用return 关键字能让内部执行结果交给函数外部来使用,如上
2.一个函数只能1次return,并且return之后的代码不会执行 (return后面数据不要换行写)
3.return会立即结束当前函数
4.函数可以没有return 返回值为undefined (return undefined)
五、作用域
思考:以下情况为何出错?
1.作用域概念
本质:限定变量的使用范围,这个范围就叫做作用域
特点:作用域提高了逻辑局部性,增强程序可靠性,减少了名字的冲突
代码:
<script>
//在Script标签里的运行区域叫做全局作用域。
let num = 100 //此时代码写在全局作用域中
function getMax() {
let num = 100
// 在函数标签内运行区域 叫做 局部作用域
}
for (let index = 0; index < 4; index++) {
// 在循环区域内 叫做块级作用域
}
while (ture) {
//块级作用域
}
</script>
2.变量作用域
概念:在不同作用域中的变量 可以叫做变量作用域
代码:
<script>
//直接写在 全局作用域 里的变量 叫全局变量
let num = 100// 任何地方都可以访问
function getMax() {
console.log(num)//可以访问到
}
getMax()
function All(params) {
//写在 局部作用域/函数作用域内的变量 叫局部变量
let num1 = 100 // 局部变量 不能在自己作用域外 使用 会报错!!!
}
console.log(num1) // 此时会报错 因为 局部变量 不能超出自己的作用域范围(大括号外)
for (let index = 0; index < 4; index++) {
// 在块级作用域内的变量 叫块级变量
// 类似局部变量,不能超出自己的作用域范围(大括号)
let num2 = 100
}
console.log(num2) // 会报错 同局部变量相同
</script>
总结:
- 可以大致分为两大类
- 全局变量 (直接放在script里)/ 局部变量(函数大括号内,块级大括号内)
- 同一作用域内 重复同一变量会出错
- 寻找变量时,优先寻找自身作用域,就近原则 判断要根据函数的定义出发 而不是函数的调用出发!!!(作用域链)
输出值:200(从函数定义出发 依据 就近原则 寻找变量即可)
5.全局变量补充细节, 代码如下:
<script>
// 当变量 没有使用 关键词 就是全局变量,了解就行 因为一般都建议使用关键字
function func1() {
/* userName = `索隆` */ //全局变量
let userName = `索隆` // 局部变量
}
func1()
</script>
六、匿名函数 (了解)
概念:拥有名字叫具名函数,没有名字叫匿名函数
<script>
//这叫具名函数 函数名称 func1
function func1() {}
//匿名函数 这段代码叫做函数表达式(表示结果的一段代码) 函数等于某个值 函数赋值给了某个变量
let func2 = function () {
console.log(`123`)
}
//调用 是一样使用的
func2()
</script>
自执行函数(了解)
<script>
// 函数在定义的同时 直接执行 叫自执行函数 = 匿名函数一起出现
// 通用功能 防止变量污染 (函数作用域功能 变量的使用)
// 使用场景 适合做一次性的任务 不希望函数可以得到复用!
// 使用函数原因 可以包装多段代码 让程序简洁
/* 需求 页面打开 标题:月薪过万 背景颜色:黄色 以后再也不用了*/
// 把匿名函数剪切 放入()中 就变成 自执行函数
(function () {
document.title=`月薪过万`
document.body.style.backgroundColor=`yellow`
})
</script>