函数是复杂数据类型:
函数就是对一段代码的封装,在我们想调用的时候调用
函数的几个优点
1. 封装代码,使代码更加简洁,减少代码量。
封装:.js文件,调用需要script标签src 引入,再使用
//判断 是 平年 或者 闰年
// year 输入年份
function isLeapOrLear(year) {
if ( year%4 == 0 && year%100 != 0 || year%400 == 0 ) {
return true // 闰年
} else {
return false // 平年
}
}
var res = isLeapOrLear(1200)
2. 复用,在重复功能的时候直接调用就好
3. 代码执行时机,随时可以在我们想要执行的时候执行
函数定义:
声明式函数:(调用函数可以在函数定义之前,也可在函数定义之后)
赋值式函数:(调用只能在函数定义之后)
函数的参数:形参是一个变量,实参是一个数值.
形参:再函数定义的时候()中写的变量名字,可以书写多个,之间逗号隔开
实参:再函数调用的时候()中写的具体的值,可ui书写多个,之间逗号隔开
return终断函数、返回值: 让后边的代码不再继续执行,注意位置。可以返回值,返回给调用者。
函数分为两种:
声明式:函数后边有函数名
赋值式(匿名函数):声明函数,函数后括号前没名
<script>
/*
声明式函数调用在创建的前后都是可以的
赋值式函数只能再创建的后面调用,前面调用会报错
原理:等下午的预解析会解释到
*/
// fn1()
// 声明式
function fn1() {
console.log('是fn1');
}
fn1() //调用函数
// 赋值式\匿名函数
var fn2 = function () {
console.log('fn2');
}
fn2()
</script>
JS预解析:
只解析:2种,如下:
2.声明式函数
<script>
fn()
var fn = function () {
console.log('我是fn函数');
}
fn()
/*
以上代码的执行过程
第一先预解析:
读第一句:不需要预解析
读第二句话:碰到var了,所以要预解析,告诉浏览器创造了一个名字为fn的变量,暂时不赋值,所以此时fn的值是undefined
读第三句:不需要预解析
执行代码
执行第一句话:fn()需要调用fn函数,此时程序中没有fn函数,只有一个fn变量,变量不是函数,后面写()语法是错误的,所以这里会报错
程序报错了,后续代码将不再执行
*/
<script>
1.用var创造的变量
<script>
/*
预解析:也叫做声明提升(声明提前)
js是一门解释型语言,解释型语言他的执行会分为2步,
第一步会先从头到尾对代码进行通读解释
第二步才会从头到尾真正执行代码
js中的预解析,只解析2个东西
1.用var创造的变量
2.声明式函数
*/
console.log(a);
console.log(a + b);
var a = 10
var b = 20
console.log(a + b);
/*
以上代码的执行过程
打开浏览器
第一步先预解析
读第一行:不需要预解析
读第二行:不需要预解析
读第三行:需要预解析,因为有var,所以这时候就会让浏览器帮我们创造一个名字位a的变量,不赋值
读第四行:需要预解析,因为有var,所以就会让浏览器帮我们创造一个名字为b的变量,不复制
读第五行:不需要
第二步执行
执行第一行:打印a的值,此时因为预解析阶段已将创建好了a但是并没有赋值,所以a的结果是undefined
执行第二行:打印a+b,因为预解析阶段已经创建好了a和b,所以此时a和b都是undefined,undefined+undefined=NaN
执行第三行:a = 10,给a赋值为10
执行第四行:b = 20,给b赋值为20
执行第五行:打印a+b,因为a和b已经有值了,分别为10和20,所以求和结果是30
*/
</script>