函数
说明&作用:
函数function,是被设计为执行特定任务的代码块。
作用:简化代码,方便复用,封装程序功能。
原理:
其实就是把具有相同或相似逻辑的代码“包裹”起来,之后哪个位置需要这个功能,直接调用函数即可。例如:
需求:我有三个数组,需要分别求出他们各自的元素和。
<script>
//声明三个不同数组
let arr1 = [20, 40, 20, 50]
let arr2 = [60, 40, 30, 40]
let arr3 = [10, 50, 20, 60]
// 封装函数
function sum1(arr) {
/* 不难看出,下面这段代码其实是单个数组求和的方式,我
们可以把它封装起来,等哪个数组有求和需要,我们就直接调
用这套代码,不就能达到求和的需要吗!也就是说,我们封装
一个数组求和函数,可以做到多次复用的效果。 */
let sum = 0;
for (let u = 0; u < arr.length; u++) {
sum += arr[u];
}
console.log(sum);
}
// 调用函数
sum1(arr1)//130
sum1(arr2)//170
sum1(arr3)//140
</script>
使用方法:
1、声明函数
// 函数声明
function 函数名(){ 函数体 }
function arr() {
alert('hai~~')
}
2、函数调用
// 函数调用
函数名()
// 函数声明
function arr() {
alert('hai~~')
}
// 函数调用
arr()
-----声明的函数必须被调用了才会真正的执行。
拓展
函数体
函数体是函数的构成部分,它负责将相同或相似代码“包裹”起来,直到函数调用时函数体内的代码才会被执行。函数的功能代码都要写在函数体当中。
函数名命名规范:
- 和变量命名基本一致;
- 尽量小驼峰式命名法;
- 前缀应该为动词;
- 命名建议:常用动词约定。
例如:
函数传参:
介绍&作用:
是函数用来接受不同数据进行计算的,多个参数之间用逗号隔开,参数可以是一个也可以是多个。
作用:提高函数的灵活性。
语法:
示例:
形参:
声明函数时写在函数名右边小括号里的叫形参(形式上的参数);
作用: 用来接收实参的数据,再把数据传给函数体进行计算。
实参:
调用函数时写在函数名右边小括号里的叫实参(实际上的参数);
作用:好比如计算多个数组和,那么实参就代表不同的数组。
// 调用函数
sum1(arr1)//实参为arr1
sum1(arr2)//实参为arr2
sum1(arr3)//实参为arr3
拓展:
- 形参可以理解为是在这个函数内声明的变量(比如 num1 = 10)实参可以理解为是给这个变量赋值;
- 开发中尽量保持形参和实参个数一致。
返回值(return)
说明:
返回值就是函数执行过后,给调用者的一个回馈值;
函数默认的返回值为undefined。
作用:
对执行结果的扩展性更高,可以让其他的程序使用这个结果。
语法:
// 函数声明
function 函数名(){
......
return 值;
}
例如:
//没有返回值
function getName() {
let a = 2;
a++;
//return a
}
alert(getName())//undefined
//设置了返回值
function getName() {
let a = 2;
a++;
return a//函数返回值为a
}
alert(getName())//3
注意:
函数里面只能执行一个return,而且执行完return后,return后面的代码将不执行,直接跳出当前函数。
let a = 2;
function getName() {
return a//函数返回值为a
a++;
}
alert(getName())//2
alert(a)//设想值为3,实际为2,因为后面那句a++没有被执行。
匿名函数(了解)
含义:
没有名称的函数(如:function () { 函数体 })
使用方法:
-
将匿名函数赋值给一个变量,并且通过变量名称进行调用 我们将这个称为函数表达式;
-
function ( ) { 函数体 }
自执行函数(了解)
介绍:
不需要调用,自己执行。
通常和匿名函数一起使用。
作用:
避免变量之间的污染。
语法:
()();
例如:
注意:
多个立即执行函数要用 ; 隔开,要不然会报错。
作用域(变量)
含义:
通常来说,一段程序代码中所用到的名字并不总是有效和可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域---只要是代码,就至少有一个作用域。
作用:
作用域的使用提高了程序逻辑的局部性,增强了程序的可靠性,减少了名字冲突。
全局作用域
声明在函数以及大括号外面的变量,在整个script标签内部或者一个独立的js文件都能访问和修改变量。
局部作用域
局部作用域也叫函数作用域,声明在函数内部的变量,只能在当前函数内部访问和修改变量。
块级作用域
声明在{}内部的变量,其实和函数作用域差不多,只能在当前的{}里面访问和修改变量。例如for、while循环。
三作用域演示:
<script>
// 声明全局变量
let a = 5;
for (i = 1; i <= 1; i++) {
// 声明块级变量
let c = 7
// 调用全局变量
document.write(`块级内-全局变量值${a}`)//5
// 调用局部变量
document.write(`块级内-局部变量值${b}`)//报错,b是局部变量,只能在它那个作用域访问
// 调用块级变量
document.write(`块级内-块级变量值${c}`)//7
}
function arr() {
// 声明局部变量
let b = 6;
// 调用全局变量
document.write(`函数内-全局变量值${a}`)//5
// 调用局部变量
document.write(`函数内-局部变量值${b}`)//6
// 调用块级变量
document.write(`函数内-块级变量值${c}`)//报错,c是块级变量,只能在它那个作用域访问
}
// 调用函数
arr()
// 调用全局变量
document.write(`全局内-全局变量值${a}`)//5
// 调用局部变量
document.write(`全局内-局部变量值${b}`)//报错,b是局部变量,只能在它那个作用域访问
// 调用块级变量
document.write(`全局内-块级变量值${c}`)//报错,c是块级变量,只能在它那个作用域访问
</script>
作用域链(就近原则)
介绍:
代码寻找变量的一种机制。
根据在内部函数可以访问外部函数变量的这种机制,用链式查找决定哪些数据能被内部函数访问,就称作作用域链。
原则:
一个位置调用了变量,那么变量值就为离它最近的作用域所声明的值(注意:调用的位置要和变量值在同一作用域里)。
注意:
1、如果函数内部或者块级作用域内部,变量没有声明,直接赋值,也当全局变量看。
2、两个作用域里声明了同一个变量,不会报错。
3、变量值的判断依据是根据函数的定义来判断的,而不是根据函数调用来判断;
<script>
let num = 100;
function func1() {
let num = 200;
// 函数的调用
fun2();
}
// 函数的定义-声明
function fun2() {
console.log(num);//num值为100
}
func1();//100
</script>
总结
看思维导图,里面有大概括