函数
为什么需要函数? 函数使用 函数传参 函数返回值 作用域 匿名函数
*1 为什么需要函数
函数: function,是被设计为执行特定任务的代码块
说明: 函数可以把具有相同或相似逻辑的代码“包裹”起来,通过函数调用执行这些被“包裹”的代码逻辑,这么做的优势是有利于精简代码方便复用。
简单点说:1:简化代码 2:方便复用 3:封装功能
函数使用
函数的声明语法:
例如:
function sayHi(){
document.write('hai..')
}
函数名命名规范
- 和变量命名基本一致
- 尽量小驼峰式命名法
- 前缀应该为动词
- 命名建议:常用动词约定
| 动词 | 含义 |
|---|---|
| can | 判断是否可执行某个动作 |
| has | 判断是否含义某个值 |
| is | 判断是否为某个值 |
| get | 获取某个值 |
| set | 设置某个值 |
| load | 加载某些数据 |
函数的调用
函数的调用语法
注意:声明(定义)的函数必须调用才会真正被执行,使用 () 调用函数
例:
- 调用的时候千万不要忘记添加小括号
- 口诀:函数不要调用,自己不执行
注意:声明函数本身并不会执行代码,只有调用函数才会执行函数体代码
函数体 函数体是函数的构成部分,它负责将相同或相似代码“包裹”起来,直到函数调用时函数体内的代码才会被执行。函数的功能代码都要写在函数体当中。
函数传参
-
为什么要有参数的函数
:这样的函数只能求 10 + 20, 这个函数功能局限非常大
解决办法:把要计算的数字传到函数内
结论:
- 若函数完成功能需要调用者传入数据,那么就需要用有参数的函数
- 这样可以极大提高函数的灵活性
2 有参数的函数声明和调用
调用语法:
例:
注意:调用函数时,需要传入几个数据就写几个,用逗号隔开
有参数的函数声明和调用
调用语法:
例:
调用函数时,需要传入几个数据就写几个,用逗号隔开
形参和实参
-
形参:声明函数时写在函数名右边小括号里的叫形参(形式上的参数)
-
实参:调用函数时写在函数名右边小括号里的叫实参(实际上的参数)
-
形参可以理解为是在这个函数内声明的变量(比如 num1 = 10)实参可以理解为是给这个变量赋值
-
开发中尽量保持形参和实参个数一致
在声明函数时,可以在函数名称后面的小括号中添加一些参数,这些参数被称为形参,而在调用该函数时, 同样也需要传递相应的参数,这些参数被称为实参
参数 说明 形参 形式上的参数 函数定义的时候 传递的参数 当前并不知道是什么 实参 实际上的参数 函数调用的时候传递的参数 实参是传递给形参的 函数形参和实参个数不匹配问题
参数个数 说明 实参个数等于形参个数 输出正确结果 实参个数多于形参个数 只取到形参个数 实参个数小于形参个数 多的形参定义为undefined,结果为NaN
代码示例1:
<script>//num1 和num2 都是形式参数
function getSum(num1,num2){
document.write(num1+num2)
}
//这里的1和5都是咱们的实际参数
//1.如果是实参的个数和形参的个数一致,则正常输出结果
getSum(1,5)
//2.如果实参数的个数大于形参的个数 多出来的实参 不会被接受 则不会参与运算
getSum(1,2,3)
//3.如果实参数的个数小于形参的个数 多余的形参定义为undefined 最终的结果是NaN
//形参可以看作不用声明的变量 num2是一个变量 但没有接收值 结果是undefined
getSum(5) //NaN
//任何数字型加undefined 返回结果都是Nan
//注意:我们尽量让实参的个数与形参的个数匹配
</script>
函数返回值
为什么要让函数有返回值
:回到问题的根本是什么是函数?
函数是被设计为执行特定任务的代码块
:执行完特定任务之后,然后呢? 把任务的结果给我们
缺点:把计算后的结果处理方式写死了,内部处理了
解决:把处理结果返回给调用者
有返回值函数的概念: 当调用某个函数,这个函数会返回一个结果出来 这就是有返回值的函数
用return返回数据
当函数需要返回数据出去时,用return关键字
语法:
怎么使用呢?
代码示例1:
<script>
function getNum(){
return 888;
}
getNum(); // getNum() = 888
document.write(getNum())
function getFood(are){
return are
}
document.write(getFood('大肘子'))
//求两个数的和 完美写法
function getSum(num1,num2){
return num1+num2
}
document.write(getSum(8,2))
</script>
代码示例2:
<script>
//04-函数返回值 求最大值
function getMax(num1,num2){
if(num1>num2){
return num1
}else{return num2}
}
document.write(getMax(8,10))
document.write(getMax(99,1))
//第二种写法 利用三元运算符 更加简洁
function getMax(num1,num2){
return num1>num2? num1:num2
}
document.write(getMax(33,44))
</script>
代码示例3:
<script>
//需求:利用函数求任意一个数组中的最大值
//求[5,2,99,101,67,77]中的最大值
function getMax(num){ //接收一个数组
let max=num[0]
for (let i = 0; i< num.length; i++) {
if(num[i]>max){
max=num[i]
}
}
return max;
}
document.write(getMax([5,2,99,101,67,77])) //实参是一个数组
</script>
细节:
- 在函数体中使用 return 关键字能将内部的执行结果交给函数外部使用
- 函数内部只能运行到 1 次 return,并且 return 后面代码不会再被执行,所以 return 后面的数据不要换行写
- return会立即结束当前函数
- 函数可以没有 return,这种情况函数默认返回值为 undefined
作用域
-
作用域概述
-
通常来说,一段程序代码中所用到的名字并不总是有效和可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域。作用域的使用提高了程序逻辑的局部性,增强了程序的可靠性,减少了名字冲突。
-
全局作用域:直接写在script标签内的代码
全局变量 任意的地方都可以访问
函数作用域*局部作用域:写在函数内部中的变量
只能在自己的大括号中使用
块级作用域:块作用域由 { } 包括,if while语句和for语句里面的{ }等 在这里面定义的变量
变量作用域特殊情况:
- 如果函数内部或者块级作用域内部,变量没有声明,直接赋值,也当全局变量看,但是强烈不推荐
- 函数内部的形参可以看做是局部变量,所以形参相当于函数内部定义的局部变量,只有在函数内部可以使用
变量访问原则-作用域链
- 只要是代码,就至少有一个作用域
- 写在函数内部的局部作用域
- 如果函数中还有函数,那么在这个作用域中就又可以诞生一个作用域
- 根据在内部函数可以访问外部函数变量的这种机制,用链式查找决定哪些数据能被内部函数访问,就称作作用域链
作用域链 :只是一种代码寻找变量来执行 机制 规则
就近的参照物是 函数的声明,函数的定义来寻找最近的变量
匿名函数
匿名函数
将匿名函数赋值给一个变量,并且通过变量名称进行调用 我们将这个称为函数表达式
语法:
调用:
其中函数的形参和实参使用跟具名函数一致
自执行函数
- 作用 :防止变量污染
- 特点 : 在定义函数的同时也执行函数
- 代码 : (匿名函数)()