一、函数
1.为什么需要函数
2.函数的使用
代码
<!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>体验函数99乘法表</title>
<style>
span {
display: inline-block;
/* 我们会发现错位了,因为两位数和一位数撑开的宽度是不一样的,查看两位数盒子的宽度来设置死宽度,然后文字居中 */
width: 100px;
padding: 5px 10px;
border: 1px solid pink;
margin: 2px;
border-radius: 5px;
box-shadow: 2px 2px 2px rgba(255, 192, 203, .4);
background-color: rgba(255, 192, 203, .1);
text-align: center;
color: hotpink;
}
</style>
</head>
<body>
<script>
// 声明
// sheet99是函数的名字
function sheet99() {
// 1. 外层循环控制行数
for (let i = 1; i <= 9; i++) {
// 2. 里层循环控制列数
for (let j = 1; j <= i; j++) {
document.write(`<span>${j} x ${i} = ${i * j}</span>`)
}
// 换行
document.write('<br>')
}
}
// 调用
// 要2个就复制两次 要50个可以for循环
// sheet99()
for (m = 0; m < 50; m++) {
console.log(sheet99())
}
</script>
</body>
</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>函数的使用</title>
</head>
<body>
<script>
// 1. 函数的声明
function sayH1() {
console.log('hi~~~')
}
// 2. 函数调用 函数如果不调用的话,自己不执行
sayHi()
</script>
</body>
</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>函数封装案例</title>
</head>
<body>
<script>
// 1. 求2个数的和
/* function getSum() {
let num1 = +prompt('请输入第一个数')
let num2 = +prompt('请输入第二个数')
console.log(num1 + num2)
}
getSum() */
// 2. 求1~100累加和
function getSum100() {
let sum = 0
for (let i = 1; i <= 100; i++) {
sum += i
}
console.log(sum)
}
getSum100()
</script>
</body>
</html>
3.函数传参
<!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>函数的参数</title>
</head>
<body>
<script>
// 2. 求1~100累加和
// function getSum(end) { //相当于写了这样一句话:end = 50
//实验一下 console.log(end)
// let sum = 0
// for (let i = 1; i <= end; i++) {
// sum += i
// }
// console.log(sum)
// }
// getSum(50) //1~50
// getSum(100) //1~100
function getSum(start, end) {
// start和end是形参 形式上的参数
let sum = 0
for (let i = start; i <= end; i++) {
sum += i
}
console.log(sum)
}
getSum(1, 50) //调用小括号里面的实参 ---实际的参数
getSum(100, 101)
</script>
</body>
</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>函数封装数组求和</title>
</head>
<body>
<script>
// 1. 封装函数
// 为了让程序更完美 给一个参数的默认值 比如:空数组
function getArrSum(arr = []) {
let sum = 0
for (let i = 0; i < arr.length; i++) {
sum += arr[i]
}
console.log(sum)
}
getArrSum([1, 2, 3, 4, 5])
getArrSum([11, 23, 66])
getArrSum()
</script>
</body>
</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>函数参数-默认参数</title>
</head>
<body>
<script>
// 函数求和
// function getSum(num1, num2) {
// 当没有实参传入的时候 num1默认的值是undefined 两个undefined相加是NaN
// document.write(num1 + num2)
// }
// getSum(1, 2)
// getSum()
// 函数求和
function getSum(x = 0, y = 0) {
// 给x, y默认的一个值 0
document.write(x + y)
}
// 优先看有没有参数传过来
getSum(1, 2)
getSum()
</script>
</body>
</html>
4.函数返回值
<!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>实参可以是变量</title>
</head>
<body>
<script>
// 求n ~ m的累加和
function getSum(n = 0, m = 0) {
let sum = 0
for (let i = n; i <= m; i++) {
sum += i
}
console.log(sum)
}
// getSum()
// getSum(1, 2)
let num1 = +prompt('请输入起始值:')
let num2 = +prompt('请输入结束值:')
// 调用函数
getSum(num1, num2) //实参可以是变量
</script>
</body>
</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>函数的返回值</title>
</head>
<body>
<script>
// 函数的返回值
function fn() {
return 20
}
// 相当于执行了 fn() = 20 fn()是调用者
// return的值返回给调用者
// console.log(fn())
let re = fn()
console.log(re)
// 求和函数的写法
function getTotalPrice(x, y) {
return x + y
// return后面的代码不会被执行
// return语句不能换行写 在我们js中,换行就相当于一个语句结束
console.log(999)
}
// console.log(getTotalPrice(1, 2)) //太麻烦
let sum = getTotalPrice(1, 2)
console.log(sum)
function fn() {
}
let re2 = fn()
console.log(re2) //返回值是undefined
</script>
</body>
</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>求最大值函数</title>
<style>
/* div {
width: 50px;
height: 50px;
background-color: pink;
margin: 100px auto;
} */
</style>
</head>
<body>
<div></div>
<script>
// 1. 求最大值函数
/* function getMax(x, y) {
return x > y ? x : y
} */
// 函数的调用
// getMax(1, 2)是调用者 相当于把2赋值给getMax,然后getMax就可以使用啦
/* let max = getMax(1, 2)
console.log(max) */
// 2. 求任意数组的最大值,并且返回
function getArryValue(arr = []) {
// (1) 先准备一个max变量存放数组的第一个值
let max = arr[0]
for (let i = 1; i < arr.length; i++) {
if (max < arr[i]) {
max = arr[i]
}
}
// (3)返回值
return max
}
// 函数内部的变量跟外部没有影响 后面要学 一个是局部变量一个是全局变量
let max = getArryValue([1, 6, 7, 9])
console.log(max)
/* const div = document.querySelector('div')
div.innerHTML = max */
</script>
</body>
</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>求最大值和最小值函数</title>
</head>
<body>
<script>
// 3. 求任意数组的最大值和最小值,并且返回
function getArryValue(arr = []) {
// (1) 先准备一个max变量存放数组的第一个值
let max = arr[0]
let min = arr[0] //最小值
// (2)遍历比较
for (let i = 1; i < arr.length; i++) {
// 最大值
if (max < arr[i]) {
max = arr[i]
}
// 最小值
if (min > arr[i]) {
min = arr[i]
}
}
// (3)返回值
// return min //return有结束语句的功能
// return max //return只能存一个值,但是数组可以存多个值
return [max, min] //返回值返回的是数组
}
// 函数内部的变量跟外部没有影响 后面要学 一个是局部变量一个是全局变量
let newArr = getArryValue([1, 6, 7, 9])
// console.log(newArr)
console.log(`数组的最大值是:${newArr[0]}`);
console.log(`数组的最小值是:${newArr[1]}`);
</script>
</body>
</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>函数细节</title>
</head>
<body>
<script>
// 函数不调用不执行 在函数调用的时候传递的参数叫做实参
function getSum(x, y) {
// 返回值返回给了谁?函数的调用者getSum(1, 2)
return x + y
}
// getSum(1, 2) //这个时候已经调用了,有结果了 但是我们要得是这个值,而不是这个调用
// let result = getSum(1, 2)=3 把返回值给调用者,调用者再赋值给result
let result = getSum(1, 2)
console.log(result);
</script>
</body>
</html>
5.作用域
<!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>作用域</title>
</head>
<body>
<script>
let num = 10 //1. 全局变量
console.log(num);
function fn() {
console.log(num);
}
fn()
// 2. 局部变量
function fun() {
let str = 'pink'
}
// 只能在函数内部使用
console.log(str);
</script>
</body>
</html>
结果:123
结果: 4 ‘22’
<!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>变量的特殊情况</title>
</head>
<body>
<script>
/* let num = 20
function fn() {
// 函数内部变量没有声明 直接赋值 也当全局变量来看 强烈不推荐 因为函数外部如果声明了一样的变量 后面的会覆盖前面的
num = 10
// 声明之后才会相互不影响
// let num = 10
}
fn()
console.log(num);
function fun(x, y) {
// 形参可以看做函数的局部变量
console.log(x);
}
fun(9, 0)
console.log(x); //错误的 */
let num = 10
function fn() {
let num = 20
function fun() {
let num = 30
console.log(num);
}
fun()
}
fn()
</script>
</body>
</html>
6.匿名函数
1.匿名函数之函数表达式
<!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>匿名函数之函数表达式</title>
</head>
<body>
<script>
/* // 1. 函数表达式
let fn = function () {
console.log('我是函数表达式');
}
// console.log(fn);
// 函数的调用
fn() */
// fn(1, 2) //错误
// 因为加了let 所以必须先声明后使用
let fn = function (x, y) {
console.log(x + y);
}
fn(1, 2)
// 函数表达式和具名函数的区别
// 1. 具名函数的调用可以写到任何位置
// 函数在哪儿调用都行 在函数声明之前调用都行
// 2. 函数表达式必须先声明函数表达式,后调用
fun()
function fun() {
console.log(1);
}
</script>
</body>
</html>
2.匿名函数之立即执行函数
<!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>立即执行函数</title>
</head>
<body>
<script>
/* (function () {
console.log(22);
})() */
// (function(){})() 立即函数也是有函数的调用的 这个小括号就相当于是
// 立即执行函数一定要加分号 不然会报错
/* (function () {
let num = 10
})(); */
// 也可以把分号写在函数前面
/* ; (function () {
let num = 10
})() */
/* (function () {
let num = 20
})(); */
// 1. 第一种写法
(function (x, y) {
console.log(x + y);
})(1, 3); //这里面是实参
// 第二种写法
// (function(){})();
(function (x, y) {
console.log(x + y);
}(2, 3));
// 立即执行函数也可以有一个函数名
(function getSum() { }())
// 如果是直接声明一个函数 会多一个函数调用的步骤
function getSum() { blublueblue }
getSum()
</script>
</body>
</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>综合案例</title>
</head>
<body>
<script>
// 1. 用户输入
let second = +prompt('请输入秒数:')
// 2. 封装函数
function getTime(t) {
// console.log(t); //总的秒数 形参和实参最好区分开来
// 3. 转换
// 小时:h = parseInt(总秒数 / 60 / 60 % 24)
// 分钟:m = parseInt(总秒数 / 60 % 60)
// 秒数:s = parseInt(总秒数 % 60)
h = parseInt(t / 60 / 60 % 24)
m = parseInt(t / 60 % 60)
s = parseInt(t % 60)
// 这一系列操作之后 还要把值赋值给h
// 函数不声明直接使用 会被当做全局变量来使用 会有风险 所以要加上let
let h = h < 10 ? '0' + h : h
let m = m < 10 ? '0' + m : m
let s = s < 10 ? '0' + s : s
// console.log(h, m, s); //后面会知道用return的好处
return `转换完毕之后是${h}小时${m}分${s}秒`
}
// getTime(second) return的值给了函数的调用者 将return的结果给一个变量更方便
let str = getTime(second)
document.write(str)
// document.write(h)
</script>
</body>
</html>
三、逻辑中断
pc端
移动端
<!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>逻辑中断</title>
</head>
<body>
<script>
function fn(x, y) {
// 另一种方法
x = x || 0
y = y || 0
console.log(x + y);
}
fn(1, 3)
// 要传参数才有值,不然x,y是undefined,undefined+undefined结果是NaN,为解决这个bug我们之前的做法是给形参一个默认值0
// undefined在逻辑运算里面当假看 所以逻辑或x || 0结果是0
fn()
// 逻辑与一假则假
// 逻辑与只要有一个假就中断操作
console.log(false && 22);
console.log(false && 3 + 9);
let age = 18
// age++自增
console.log(false && age++); //age++就不执行了 因为逻辑与一假则假
console.log(age);
// 逻辑或一真则真
// 逻辑或只要有一个真就中断操作
console.log(22 || age++);
console.log(age);
console.log(11 && 22); //都是真值,则返回最后一个真值
console.log(11 || 22); //都是真值,则返回第一个真值
</script>
</body>
</html>
四、转换为布尔型
字符串只有空字符串为假,其余为真;数字只有0为假,其余为真
<!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>转换为布尔型</title>
</head>
<body>
<script>
console.log(Boolean('pig'));
console.log(Boolean(''));
console.log(Boolean(0));
console.log(Boolean(90));
console.log(Boolean(-90));
console.log(Boolean(undefined));
console.log(Boolean(null));
console.log(Boolean(NaN));
if (true) {
console.log(33);
}
// 声明变量不给值是undefined undefined转换为布尔型为false 所以不打印输出
let age
if (age) {
console.log(66);
}
</script>
</body>
</html>