声明和调用
函数可以把具有相同或相似逻辑的代码“包裹”起来,通过函数调用执行这些被“包裹”的代码逻辑,这么做的优势是有利于精简代码方便复用
声明(定义)
声明(定义)一个完整函数包括关键字、函数名、形式参数、函数体、返回值5个部分
调用
声明(定义)的函数必须调用才会真正被执行,使用 ()
调用函数。
// 1.声明函数
// function 函数名() {
// // 函数体:真正去执行的代码
// }
// 1.声明函数
function Hello() {
console.log('hello');
}
// 2.调用函数 函数名()
Hello()
Hello()
// 注意:默认是不执行,必须要调用才能执行
函数的参数
// 定义函数时参数叫形参,形式上的参数可以理解为我定义一个变量
function getSum(x, y, z) {
console.log(x, y, z);//5,8,undefined
console.log(x + y);
}
// 2.调用这个函数
// 实参:在调用函数时传递的参数,可以理解为在为上面形参赋值
// getSum(1, 5) //6
getSum(5, 8)//13
// 注意点:实参和形参最好多应,不然多于的形参参数返回undefined
多余形参默认是undefined
// 1.数组求和的功能,这个数组不固定,封装一个函数,把数组当参数传递
// 设置默认参数,防止用户没有传递参数,程序报错
function getArrsum(Arr = []) {
let sum = 0
// 函数体:数组求和
for (i = 0; i < Arr.length; i++) {
sum += Arr[i]
}
console.log(sum);
}
// 2.调用函数的时候传递数组
getArrsum([100, 40, 60, 80, 90, 60, 70])
函数的返回值
// 函数的返回值:就是函数执行完毕,会返回一个结果,结果需要在外部输出,通过函数返回值返回出来
function fn() {
// return返回 值(结果)
return 20
}
// 调用者
console.log(fn());
//fn() = 20
注意:
function fn(x, y) {
// 函数没有retrun关键字返回的结果是undefined
x + y
}
console.log(fn(2, 2));
函数要是没有retrun关键字返回的结果是undefined
作业域
<script>
/* 作用域:代码的可应用范围,变量生效范围
1.全局作用域(全局变量) 生效范围 (整个js文件)
2.局部作用域(局部变量,函数作用域) 生效在函数内部
2.块级作用域 (块级变量)只能在循环和判断语句生效
*/
function f1() {
let num = 123
function f2() {
console.log(num);
}
f2()
}
let num = 456
f1()
</script>
实例
<script>
function fn(x = 0, y = 0) {
// 2.函数内部形参默认是局部变量
console.log(x, y);
a = 100
b = 200
let c = 500
console.log(a, b, c);
}
fn(10, 20)
console.log(x, y);//报错x,y,,没有定义
console.log(a, b, c);//100 200 报错
函数表达式
// 具名函数
function fm() {
return 300
}
console.log(fm());
// 匿名函数
// 函数表达式:通过变量名调用匿名函数方式称之为函数表达式
let handle = function () {
return 320
}
console.log(handle());
// 注意: 使用函数表达式,调用要放在函数的下面,变量先定义在使用
立刻执行函数(项目用的很多,解决全局变量污染问题)
// 立即执行函数(非匿名函数)
// 作用:解决全局变量污染问题,解决全局变量名重复的问题
let a = 309;
//写法1 (())()
(function (x, y) {
console.log(x, y);
let a = 10
console.log(a);
}
)
(10, 300);
//写法2 (()())
(function () {
let a = 20
console.log('这个自调用函数');
}());
// 注意点;自调用函数之间哟啊使用分隔符隔开,不然就报错