什么是函数?-----可以理解为函数是一个盒子。
写一个函数分为两部分:1.定义阶段 2.调用阶段
01-函数的定义
函数有两种定义
声明式定义函数
语法:function 函数名 () {}--------------function是关键字
赋值式定义函数
语法:var 变量名 = function () {}
/**
//各个部位的含义
* function () {} ---> 匿名函数
* function 关键字, 表明后续紧跟一段代码, 是函数
* () 内部书写, 参数 后续讲,暂时先记住, 暂时理解为 固定写法
* {} 内部书写, 函数调用执行时 的代码(可以理解为 要执行的代码)
*
* function fn1() {} ---> 具名函数
* funtion 关键字, 同上
* fn1 函数名, 将来可以通过 这个名字(变量) 去调用(去找到)本函数
* () 参数, 同上
* {} 要执行的代码段, 同上
*/
函数的定义:
// 赋值式定义
var fn = function () {}
console.log(fn)
// 声明式定义
function fn1() {}
console.log(fn1)
02-函数的调用
语法:函数名( )
function (a) {
console.log(111)
}
a()
声明式与赋值式的与别
书写不同
打印时,声明式会带上函数名,赋值式没有
调用时的差异:声明式:可以在函数定义前 调用
fn1() // 111
function fn1() {
console.log(111)
}
fn1() // 111
03-函数的参数
参数分为两种
形参:函数名后(function)后边的小括号内部,没书写一个,就相当于在函数内部声明一个变量,可以在与函数内部去调用。
实参:调用函数时的小括号内部书写的值,就是实参,实参与形参为一一对应的关系
注意:如果实参数量 少于 形参 那么前边的形参对应接受值,没有对应实参 的 形参在 值 为undefined
如果形参数量 少于 实参 那么会一一对应后,多余的实参无法通过参数获取
// function fn(a, b, c) {
// console.log(a, b, c)
// }
// fn(1, 2, 3) // 1 --- 2 --- 3
// fn(1, 3) // 1 --- 3 --- undefined
// fn(2) // 2 --- undefined --- undefined
04-函数的返回值
语法:return 需要返回的内容
如果我们不写return 函数会默认在代码段最后一行写上 return undefined
什么时候需要写返回值 取决于是否需要得到函数内部某一个变量的值,如果需要 可以使用返回值将其返回,如果不需要可以不写
return具有中断函数的功能----如果不想中断函数,要把return放在函数最后面
// return 中断函数
function fn() {
console.log(1)
return
console.log(2)
console.log(3)
console.log(4)
console.log(5)
}
fn()
案例1--利用函数判断一个数是不是水仙花数
function fn(num) {
// 1. 判断该数字是否为水仙花数
// 1.1 拿到 各个 位置上 的数字
var baiW = parseInt(num / 100)
var shiW = parseInt(num % 100 / 10)
var geW = num % 10
// 1.2 拿到各个位置上的数字 的 三次方的和
var sum = baiW ** 3 + shiW ** 3 + geW ** 3
// 2. 如果是水仙花数, 返回 true, 如果不是水仙花数, 返回 false
if (sum == num) {
// 是水仙花数
return true
} else {
// 不是水仙花数
return false
}
}
var bo = fn(153)
console.log(bo)
var bo1 = fn(666)
console.log(bo1)
案例2---在1000和2000之间的数字内,求出是4的倍数,且不是100的倍数的数字。
// function fn(a, b) { // 一定要确保 a 的值 小于 b
// var num = 0
// for (var i = a; i < b; i++) {
// if (i % 4 == 0 && i % 100 !== 0) {
// // console.log(i)
// document.write(i + ' ')
// num++
// if (num == 4) {
// document.write('<br>')
// num = 0
// }
// }
// }
// }
// fn(3000, 5000)
案例3--计算两个 数的和, 并且在此之前做判断, 如果有一个参数不是 number 类型的 那么停止函数
function add(a, b) {
if (typeof a !== "number" || typeof b !== 'number') {
console.log('参数 a 或者 参数 b 其中有一个 不是 number 类型的, 终止函数运行')
// 停止函数
return false
} else {
console.log('a + b 的和: ', a + b)
}
return a + b
}
add(100, 200)
add(100, '200')
案例4 ---求质数
function fn(a) {
// 1. 判断传入参数是否为质数
var count = 0 // 计数器
for (var i = 2; i < a; i++) {
if (a % i == 0) {
count = count + 40 // 只是为了让 count 有变化, 具体+40 还是加多少, 无所谓
}
}
// 2. 根据传入的参数决定返回什么值
if (count == 0) {
// 应该是 质数
return true
} else {
// 这里 不是 质数
return false
}
// count == 0 ? (return true) : (return false) // 三目 不能书写 return true 或者 return false
}
var a = fn(9) // 9 不是质数, 所以最终返回值应该是 false
console.log(a)
var a1 = fn(7) // 7 是质数, 所以最终返回值应该是 true
console.log(a1)
05-函数的预解析
函数的预解析,可能会遇上同名变量的变量提升(变量的预解析) 直接以函数为主
在Js中只有变量和函数才会有预解析或者提升
预解析后会把函数提升到当前作用域的最顶层
/**
*
* var fn = 'hhh'
console.log(fn)
fn()
function fn() {
console.log(1)
}
fn()
在 JS 中 只有变量和函数才会有预解析或者 提升
1. var fn = 'hhh' // 有提升
2. console.log(fn) // 没有
3. fn() // 没有
4. function fn() { // 有提升
console.log(1)
}
5. fn() // 没有
预解析之后
1. function fn() {
console.log(1)
}
2. var fn; // 没意义
3. fn = 'hhh' // 这行很重要, 直接将变量内保存的 函数 更改为了 'hhh'
4. console.log(fn) // 按照分析, 此处应该打印 'hhh'
5. fn() // 按照分析, 此处 fn 的值应该 'hhh' 所以会报错 fn is not a function
6. fn() // 按照分析, 此处 fn 的还是 'hhh' ,所以还会报错 fn is not a function
*/
\