函数
语法:function 函数名称(){函数体}
命名规范:前缀应该是一个动词,多单词组合使用驼峰命名法
函数名称:可以使用字母,下划线,$,数字,但不能以数字开头
调用:函数声明定义之后,并不会自动执行,我们得需要手动调用
语法:函数名称() ,调用函数就是执行函数体中的所有代码
一个小细节:{ } 能不能省略的问题
// if:如果if的代码块只有一句,可以省略{}
// 注意:如果没有{},if结构只会影响后面一句
// if (false) console.log(123);//不打印 console.log(456);//打印
// for:如果循环体只有一句,那么可以省略{},
// 注意,循环只会影响后面一句
// for (let i = 0; i < 5; i++) console.log(123);//打印5次 console.log(456);//打印一次
// 但是:函数的{}不能少,哪怕只有一句
// function test() console.log(123);//直接报错
// test()
// 建议:不管几句,代码写严谨,+{}
参数设置
形参:
1.在定义方法时声明的参数,在方法的()中声明的
2.形参,形式参数,说明这里需要一个值
3.特点:
1.调用前,它是一个参数的占位,说明调用方法需要一个传递值过来
没有传递参数,形参值默认为undefined,相当于定义了一个变量但是却没有赋值
2.调用时,形参是 方法的局部变量 ,只有在方法中可以使用,在方法外不能使用
调用方法传递参数,实质就是 实参为形参赋值的过程
实参:
1.实参是指实质参数,也就是实质存在的值,它是一个真正的值
2.实质是调用者来准备的
结论:调用方法传递参数,实质就是 实参为形参赋值的过程
函数的返回值
函数功能的单一性:函数一般只做业务处理,并不会对结果进行处理
它会将 结果返回, 让调用者进行处理
1.函数的最后返回结果--return关键字可以实现函数值的返回
2.调用函数时接受结果--定义一个变量用于接受函数的返回值
函数的返回值的细节:
1.如果函数内部没有写 return 来返回值,也会默认返回undefined
2.默认情况下,函数只能返回一个值(变量),如果想返回多个值,一般可以使用一个结构(对象)进行包装
如果直接返回多个值,最终只会返回最后一个值
例如:return sum, name 只会返回name
所以我们可以打包成一个数组, return [sum, name]
3.return 有两种常用功能:01.返回值 02.结束当前函数--这个return是结束当前函数,后面的不再执行
4.return 只能写在函数中,如果写在函数外面 直接报错:Illegal return statement--非法的return语句
作用域
// 一:全局作用域--全局变量
// 如果没有声明这个变量,报错:age is not defined 没有定义
// Cannot access 'age' before initialization 不能再初始化之前访问age
// console.log(age);
// let age = 20
// 如果一个变量没有声明,而是直接赋值使用,相当于定义了一个真正的全局变量
// 它会将这个变量挂载到window全局,页面不关闭,变量不会释放,严重的会造成全局污染
// for (i = 0; i < 5; i++) {
// console.log(i);
// }
// console.log(window);
// 二:局部作用域,也叫函数作用域--局部变量
// 在函数内部声明的变量,在函数外部不能使用(形参相当于函数的局部变量)
// function test() {
// let age = 20
// }
// test()
// console.log(age); //报错:age is not defined
// 三:块级作用域--块级块级
// 块:就是指{}
// 1.作用域:变量所在的{}结构
// 2.有效作用域:从定义这个变量开始,到这个变量所在的 } 结束
// if (true) {
// console.log(age);//报错:Cannot access 'age' before initialization
// let age = 20
// }
// console.log(age);//报错:age is not defined
变量查找原则--就近原则
变量的使用原则:就近原则:自己有就使用自己的,自己没有就查找外部作用域 如果;查到全局变量都没有,那就报错
匿名函数
<p>我是p元素,我的颜色是黑色</p>
<button>单击将p元素颜色修改为红色</button>
<script>
// 具名函数:在声明函数的时候为函数命名
// 这种方法定义的函数将会挂载到全局window,页面不关闭,不释放,严重的造成全局污染
function aabb() { //这种有名字的函数就叫具名函数,函数名是aabb
console.log(123);
}
// 调用函数
aabb()
// 匿名函数:在声明函数的时候没有名称,匿名函数不能单独存在,一般作为变量的值,【重点:或者作为参数】
// function() { } -- 这种没有名字的函数就叫匿名函数,单独存在会报错
// 所以我们要将匿名函数作为一个变量的值,那么这个时候变量abc就是一个函数了--函数表达式
// 使用匿名函数,不会挂载到全局window,可以很好的解决function函数的全局污染问题
let abc = function () {
console.log(456);
}
// 调用: 函数名()
abc()
console.log(window);
// 【重点:把匿名函数作为参数】 -- 案例
let p = document.querySelector('p')
let btn = document.querySelector('button')
btn.addEventListener('click', function () { //这个函数是个匿名函数,且作为一个参数
p.style.color = 'red'
})
</script>
\