js 函数 (function)
1.函数的简单作用
-
函数:function,是被设计为 执行特定任务 的代码块
-
说明: 函数可以把具有相同或相似逻辑的代码 “包裹” 起来,通过函数调用执行这些被 “包裹” 的代码逻辑,这么做的优势是有利于 精简代码方便复用。 ( 同样的功能,不用再敲一遍代码,直接用函数名放过即可 )
2.函数的使用
①. 函数的声明语法
<script>
/* function 函数名() {
函数体
} */
function sayHi() {
document.write(`hai 靓仔`)
}
</script>
②. 函数命名规范
-
与变量命名基本一致
-
尽量小驼峰式命名法
-
前缀应该为动词
-
命名建议:常用动词约定
-
动词 含义 can 判断是否可执行某个动作 has 判断是否含义某个值 is 判断是否为某个值 get 获取某个值 set 设置某个值 load 加载某些数据
<script>
function getName() {}
function addSquares() {}
</script>
③. 函数的调用语法
<script>
function getName() {}
function addSquares() {}
// 函数调用, 这些函数体内的代码逻辑会被执行
// 函数名()
// 注意点: 声明(定义)的函数必须 调用才会真正被执行,使用()调用函数
// 函数一次声明可以多次调用,每一次函数体里面的代码会重新执行一次
getName()
addSquares()
// 我们曾经使用的 alert() , parselnt() 这种名字后面跟小括号的本质都是函数的调用
</script>
④. 函数体
函数体时函数构成部分,它负责将相同或相似代码 “包裹” 起来,直到函数调用时函数体内的代码才会被执行。函数的功能代码都要写在函数体当中
3.函数传参
①. 函数的参数
我的理解是:用函数定好一个功能,先不定数据。再由调用者传入不同的数据 用这个函数的功能去处理 (要确定你这个数据是适用的)
②.有参数的函数声明和调用
-
参数列表
》 传入数据列表
》 声明这个函数需要传入几个数据
》 多个数据用逗号隔开
-
声明语法:
<script>
// 声明语法:
/* function 函数名( 参数列表 ) {
函数体
} */
// 单个参数
function getSquares(num1) {
document.write(num1 * num1)
}
// 多个参数
function getSum (num1, num2) {
document.write(num1 * num2)
}
</script>
③. 形参和实参
- 形参:声明函数时写在函数名右边小括号里的叫形参 (形式上的参数)
- 实参: 调用函数时写在函数名右边小括号里的叫实参 (实际上的参数)
- 形参可以理解为是 在这个函数内声明的 变量 (比如 num1 = 10)实参可以理解为是给这个变量赋值
- 开发中尽量保持形参和实参个数一致
- 我们曾经使用过的 alert(' 打印 '),parselnt(' 11 '), Number( '11' )本质上都是函数调用的传参
4. 函数返回值
①.返回值介绍
概念:把 **执行特定任务 **的代码块,所处理好的结果 返还给我们
-
缺点:把计算后的结果处理方式写死了,内部处理了
-
解决:把处理方式返回给调用者
-
有返回值函数的概念:
》当调用某个函数,这个函数返回一个结果出来
》这就是有 返回值 的函数
②.用return返回数据
③.细节:
- 在函数体中使用 return 关键字能将内部的执行结果交给函数外部使用
- 函数内部只能运行到 1 次 return ,并且 return 后面代码不会再被执行, 所以 return 后面的数据不要换行写
- return 会立即结束当前函数
- 函数可以没有 return ,这种情况函数默认返回值为 undefined
<script>
// 用函数找出两个数组的最大值
function getMax(arr) {
let max = arr[0]
for (let i = 0; i < arr.length; i++) {
if (max < arr[i]) {
max = arr[i]
}
}
return max; // 返回值
}
let arr1 = ([1, 3, 4, 2, 22]);
let arr2 = ([3, 2, 63, 23, 4]);
// 调用者 选择的输出结果
document.write(`${getMax(arr1)} `)
console.log(getMax(arr2));
// 这是用同样的方法找出 最小值
function getMin(arr) {
let min = arr[0]
for (let i = 0; i < arr.length; i++) {
if (min > arr[i]) {
min = arr[i]
}
}
return min; // 返回值
}
let arr3 = ([1, 3, 4, 2, 22]);
let arr4 = ([3, 2, 63, 23, 4]);
// 调用者 选择的输出结果
document.write(`${getMin(arr1)} `)
console.log(getMin(arr2));
</script>
5.作用域
①.作用域概述
-
通常来说,一段程序代码中所用到的名字并不总是有效和可用的,而限定这个名字的 可用性的代码范围 就是这个名字的 作用域。
-
作用域的使用提高了程序逻辑的局部性,增强了程序的可靠性,减少了名字冲突
-
局部作用域 和 块级作用域 差不多的 区别不是很大
②.变量的作用域
-
变量作用域的特殊情况:
》如果函数内部或者块级作用域内部,变量没有声明,直接赋值,也当 全局变量 看,但是强烈不推荐
》函数内部的形参可以看做是局部变量,所以形参相当于函数内部定义的局部变量,只有在函数内部可以使用。
④. 变量访问原则-作用域链
- 只要是代码,就至少有一个作用域
- 写在函数内部的局部作用域
- 如果函数中还有函数,那么在这个作用域终究又可以诞生一个作用域
- 根据在内部函数可以访问外部函数变量的这种机制,用链式查找决定哪些数据能被内部函数访问,就称作作用域
6.匿名函数
匿名函数目前先了解即可
1.
2.
3.
4.