1. 函数的声明
- 方式一
// 利用函数关键字自定义函数(命名函数)
function fn(){
// 函数体
}
fn();
- 方式二
// 函数表达式(匿名函数)
let fn = new function() {
// 函数体
}
fn();
2. 函数的使用
函数被调用,才能被执行
函数可以反复被调用
我们曾使用过的 alert( ) 、 parseInt( ) 这种后面跟小括号的,本质上都是函数的调用
// 函数的声明
function cook(fan) {
console.log(fa n);
}
// 函数的调用
cook('酸辣土豆丝');
任意两个数之间的和:
// 任意两个数之间的和
// 声明
function getSums(start, end) {
let sum = 0;
for (let i = start; i <= end; i++) {
sum += i;
}
return sum;
}
// 调用
getSums(1,100);
3. 立即执行函数
- 两种方式
(function(){ //函数体 })();
(function(){ //函数体 }());
(function ( x, y) {
console.log(x +y)
}) (1,2)
立即执行函数是匿名函数的一种
不需要调用,立即执行
多个立即执行函数之间 需要用 ; 隔开
4. 实参与形参的匹配
-
实参 > 形参 :取形参个数
-
实参 < 形参 :缺少的形参值为 undefined,结果NaN
-
建议:形参与实参相匹配
🔔 当用户不传入实参 时,会出现 undefined + undefined = NaN
解决方法:
当用户不输入实参时,可以给形参设置默认值(如下代码)
这个默认值只会在缺少实参的情况下才会被执行,所以参数会优先执行传递过来的实参
// 举例
function getSum(a = 0, b = 0) {
return a + b
}
5. 函数的作用域
5.1 作用域
- 作用域:通俗来讲,就是这个名字(或代码)起作用的范围
1. 全局作用域 【全局有效】整个 script 内部起作用
2. 局部作用域 【局部有效】在函数内部起作用(函数作用域)
3. 块级作用域 【 {} 内有效 】eg: for 循环的{}内
5.2 变量作用域
1. 全局变量 【函数外部 let 变量】在任何区域都可以访问和修改
2. 局部变量 【函数内部 let 变量】只能在当前函数内部访问和修改
3. 块级变量 【{} 内部的 let 变量】只能在{} 里,访问修改,不能跨域访问
注意:
-
在函数内部,没有声明直接复制的变量,当作全局变量(不推荐这样使用)
-
函数内部的形参可以看做局部变量
5.3 变量的访问原则
- 采用作用域链 (就近原则):先看当前作用域,如没有,则看上一级作用域,以此类推
- 例如:下图结果为 123
6. 匿名函数
- 匿名函数:
function() {
// 函数体
}
- 函数表达式:将匿名函数的值给一个变量,通过变量名进行调用
let fn() = function() {
// 函数体
}
7. return
7.1 return 返回值
-
若函数有 return ,return 后面的代码不会被执行,如果有数据需要返回,,不要在 return 后面进行
-
若函数没有 return ,则返回 undefined
function getMax(sum1, sum2) {
return num1 > num2 ? num1 : num2;
}
var max = getSum(1,22);
7.2 return 能终止函数
-
return 后面所有行的代码不会被执行
-
return 只能返回一个值,若需返回多个值,可通过返回数组实现
function getResult(num1, num2) {
return [num1+num2, num1*num2, num1/num2];
}
8. 函数可以相互调用
计算平闰年
// 判断平、闰年
function isRunYear(year) {
let flag = false;
if(year % 4 == 0 && year%100 != 0 || year % 400 ==0){
flag = true;
}
return flag;
}
function backDay() {
let year = prompt('请输入年份:');
if (isRunYear(year) == true) {
alert('当前年份是闰年2月份有29天') //2000
} else {
alert('当前年份是平年2月份有28天');
}
}
backDay();