函数(function)
函数(fun): 封封某一段脚本代码的代码块(有名称),可以被 调用
- 无参无返回值
- 带参带返回值
- ES6支持可变数量的参数(rest参数)
- 可以将函数直接赋给某一个变量,变量就带表函数本身
- 箭头函数(类似Java语言中的拉姆达表达式)
- 匿名函数
备注:所有脚本库或者脚本框架都设计成一个匿名函数;
函数调用结束后,函数内部定义的所有资源都会释放掉;
问题:匿名函数执行完后,内部的某一个对象需要保持存活状态?
请看代码中最后部分
HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>4.html</title>
</head>
<body>
<div>
<script>
// 无参无返回值的函数
function fn1(){
console.log("fn1");
}
// 调用函数
fn1();
// 带参数,有返回值,设置c的默认值为1的函数
function fn2(a,b,c=1){
c = a + b;
return c;
}
let sum = fn2(1,2,0);
console.log("fn2",sum);
// Java中的可变参数:...变量名
function fn3(...args){
let sum = 0;
for(let i = 0;i<args.length;i++){
sum += args[i];
}
return sum;
}
let sum1 = fn3(1,2,3,4);
console.log("fn3",sum1);
/* 可以将一个函数赋值给一个变量,相当于给函数起了个名字
也可以说是一个匿名函数赋值给一个变量,变量名就是函数名
匿名函数没有名字,需要括号括起来,无法显示调用
匿名函数的自调用,在匿名函数后面加一个括号 ,将会立即调用匿名函数*/
(function(){
console.log("匿名函数自调用");
}) ();
let fn4 = function(a,b){
return a + b;
};
console.log("fn4",typeof fn4,fn4(1,2));
// 箭头函数(类似于Java中的拉姆达表达式) 简化关系:函数->匿名函数->箭头函数
// 匿名函数:function(){}; 不写函数名
let fn5 = (a,b)=>{return a + b;};//相当于fn4,这是简化写法
// 当函数只有一行代码时,可写成let fn5 = (a,b)=>a + b;
console.log("fn5",typeof fn5,fn5(1,2));
// 函数调用结束后,函数内部定义的所有资源都会释放掉
// 定义匿名函数,并自调用
(function(){
// 定义全局变量
var i = 10;
})();
// 无法访问i了
// console.log(i);
// 若需要继续保持可访问,需要提升参数的作用域(从方法(函数)提升到顶级)
// 定义匿名函数,并自调用
(function(){
// 定义全局变量,同时将作用域提升到顶级
window.i = 10;
// 定义函数fn6, 同时将作用域提升到顶级
window.fn6 = function(){
console.log("作用域提升后的函数fn6");
};
})();
// 可以访问i了
console.log("作用域提升后的i",i);
// 可以访问fn6
fn6();
// 所有脚本库或者脚本框架都设计成一个匿名函数,
// 同时通过上述方法,保证函数内部的某个对象保持存活状态
</script>
</div>
</body>
</html>
结果: