函数加案例实战加作用域等拓展了解
1.函数的认知
函数也是数据类型的一种,它就是可以将需要的元素封装起来,等需要的时候再调用,但是它不止可以调用一次,它可以调用无数次
写法如下
<script>
// 1.声明或者定义函数
// 2.函数的命名(使用有意义的命名,例如前面动词加小驼峰)
// 3.然后大括号封装
// 4.外部输入,可以无限次使用
function sayHi() {
console.log('我很好');
console.log('你很好');
console.log('他不好');
}
sayHi() // 输出三句话第一次
sayHi()// 输出三句话第二次
sayHi()// 输出三句话第三次
</script>
案例 函数的调用 -99乘法表
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no"
/>
<title>05-99乘法表-函数调用</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
span {
border: 1px solid #000;
padding: 10px 0;
width: 100px;
text-align: center;
display: inline-block;
}
</style>
</head>
<body>
<script>
// 1 声明函数 - 输出 99乘法表
function calcNum() {
for (let index = 1; index <= 9; index++) {
for (let index1 = 1; index1 <= index; index1++) {
let num = index1 * index;
document.write(`<span> ${index1} * ${index} = ${num} </span>`);
}
document.write('<br/>');
}
}
// 2 调用函数-输出三次99乘法表
calcNum();
calcNum();
calcNum();
</script>
</body>
</html>
案例 函数的封装
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no"
/>
<title>06-函数封装.html</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
</style>
</head>
<body>
<script>
// 封装的函数不够灵活 无法复用 没有感受到 提高!!
// 计算 3 + 2 的和
// 计算 1-50 的和
// 只能计算 100 + 1
function calcSum1() {
let a = 100;
let b = 1;
console.log(a + b);
}
// 计算 3 + 2 的和
function calcSum3() {
let a = 3;
let b = 2;
console.log(a + b);
}
// 只能计算 1-100 和
function calcSum2() {
let sum = 0;
for (let index = 1; index <= 100; index++) {
sum += index;
}
console.log(sum);
}
// 计算 1-50 的和
function calcSum3() {
let sum = 0;
for (let index = 1; index <= 50; index++) {
sum += index;
}
console.log(sum);
}
calcSum1();
calcSum2();
// console.log();
// document.write()
// alert(789);
</script>
</body>
</html>
2.形参
函数-参数
声明函数后面是函数的命名,命名括号里面是形参,就是形式上的参数,没有实际值的,后面函数输出的时候加上实参才算有实际值,形参和实参的位置顺序不能调换如(a,b)(1,2)a对应1,b对应2
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no"
/>
<title>07-函数参数.html</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
</style>
</head>
<body>
<script>
// 声明函数
function getSum(num1, num2) {
// num1 = 100
// num2 = undefined
console.log(num2);
document.write(num1 + num2);
// 100 + undefined
}
// function getSum(a, b) {
// document.write(a + b);
// }
// getSum(10, 20);
// getSum(100, 200);
</script>
</body>
</html>
案例 计算数组里面的总值
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no"
/>
<title>08-计算总分.html</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
</style>
</head>
<body>
<script>
// 函数的声明
function calcSum(arr) {
let sum = 0;
for (let index = 0; index < arr.length; index++) {
sum += arr[index];
}
console.log(sum);
}
// 函数的调用
let arr1 = [1, 3, 4, 2, 22];
let arr2 = [3, 2, 22, 41, 3];
calcSum(arr1);
calcSum(arr2);
</script>
</body>
</html>
案例 函数参数的补充
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no"
/>
<title>09-函数和参数.html</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
</style>
</head>
<body>
<script>
// // 函数的声明
// function sayHi(a) {
// a = '大家好';
// // a="海贼王";
// // a 用来代表这 外部会传入尽量的 一个数据 而已 别名 这个家伙
// console.log(a);
// }
// // 函数的调用 + 传参
// // sayHi('你好');
// sayHi('大家好');
// let userName = '海贼王';
// sayHi(userName);
// 希望有一个函数 可以自动针对传入的 数组 来求和
function calcSum(a) {
// 默认a就是一个数组 =[1,2,3] [4,5,6]
let sum = 0;
for (let index = 0; index < a.length; index++) {
sum += a[index];
}
console.log(sum);
}
// 实参和形参有几个
// 函数调用的时候,括号里面有几个数据 就是几个参数
calcSum([1, 2, 3, 4]);
calcSum([1, 33, 23, 43]);
</script>
</body>
</html>
案例 函数-计算数组的最大值
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no"
/>
<title>10-计算数组的最大值.html</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
</style>
</head>
<body>
<script>
// // 写一个函数 接收一个参数-数组 输出最大值
// let arr = [1, 3, 2, 2, 4, 5];
// function getMax(abc) {
// // 你来写
// }
// getMax(arr); // 5
// getMax([3, 1, 3, 2, 11]); // 11
// 如果不做函数封装 你能不能写出来 OK-之前的循环的代码 没有写熟
function getMax(a) {
// a 就是一个数组
// let arr = [1, 3, 2, 2, 4, 5];
let max = a[0];
for (let index = 0; index < a.length; index++) {
if (a[index] > max) {
max = a[index];
}
}
console.log(max);
}
getMax([1, 3, 11, 1234]); // 1234
getMax([3, 1, 3, 2, 11]); // 11
</script>
</body>
</html>
案例 函数-求数组里面的奇数和
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no"
/>
<title>11-计算数组中的奇数的和.html</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
</style>
</head>
<body>
<script>
// 如何重复写函数的 ?
let arr = [1, 3, 4, 1, 22, 3, 4, 5];
function getSum(arr) {
let sum = 0;
for (let index = 0; index < arr.length; index++) {
// 判断当前的数字是不是小数, 如果是 跳过本次循环 continue
// 判断当前数字是不是小数 很多做法的。。
// 找到奇数
if (arr[index] % 2 !== 0) {
// 奇数
sum += arr[index];
}
}
console.log(sum);
}
getSum(arr); // 数组中 奇数的总和 1 3 7 9 ... +
// 写一下 求奇数和的代码
// 补充
// 你的需求是什么 ?
// 用户真的输入了 带小数 1.1 不添加,还是取整后 1.1 = 1 再去判断
// 1.1 => 2 再去判断。。
// 1.1 判断如果是小数 直接不添加了。。
</script>
</body>
</html>
拓展知识-函数-判断当前数字是不是小数案例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no"
/>
<title>12-拓展.html</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
</style>
</head>
<body>
<script>
// 了解即可 大家不用管实现 超纲 了解
// 会去判断当前数字是不是小数
function isFloat(num) {
// num = 1.1
// num =>取整 num2= 1 拿 num2 和 num 做比较 不相等 就表示 num = 小数
// let num2 = parseInt(num); // num = 1
// // 判断两个变量是否相等
// if (num !== num2) {
// console.log(num, 'num就是小数');
// } else {
// console.log(num, 'num是整数');
// }
if (num.toString().includes(".")) {
console.log(num, 'num就是小数');
} else {
console.log(num, 'num是整数');
}
}
isFloat(11);
isFloat(11.1);
isFloat(11.3);
isFloat(15);
</script>
</body>
</html>
案例 函数-求两个数之中的最大值
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no"
/>
<title>13-算最大值.html</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
</style>
</head>
<body>
<script>
let num1 = 300;
let num2 = 300;
// 写综合案例的时候
// 1 逻辑思维还在逐渐的形成当中-编码思维
// 2 代码的结构的熟练度
function getMax(n1, n2) {
if (n1 > n2) {
console.log('最大的是' + n1);
} else {
console.log('最大的是' + n2);
}
}
getMax(num1, num2); // 输出 两个参数中 比较大的那一个值
</script>
</body>
</html>
3.函数的返回值加案例实战
return:函数的返回值,注意点是必须在函数的里面,还有要在最下面因为输出了返回值之后在它下面的都不会执行了
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no"
/>
<title>14-函数的返回值.html</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
</style>
</head>
<body>
<script>
// function getMax() {}
// function getSum() {}
// // 这个num1 就是 函数getMax调用的返回值 ( num1 = 1 2 。。)
// // let num2 = getSum();
// let num1 = getMax();// 我们自己写的函数 只能返回 undefined
// let num3 = parseInt(1.3);// js自己内部写的 返回值 1
// console.log(num3); //
function getMax() {
// 100 就是 函数在执行完毕的时候 会返回的数据
return 300;
}
let num1 = getMax(); // num1 =100
console.log(num1);
</script>
</body>
</html>
函数返回值的使用场景
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no"
/>
<title>15-函数的返回值的使用场景.html</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
</style>
</head>
<body>
<script>
// 函数 参数的最大值
function getMax(n1, n2) {
if (n1 > n2) {
return n1;
} else {
return n2;
}
}
// 通过 console.log 帮我打印
// let num1 = getMax(1, 3);
// console.log(num1);
// let num1 = getMax(1, 3);
console.log(getMax(1, 3));
// 通过 document.write 帮我打印
// let num2 = getMax(2, 4);
document.write(getMax(2, 4));
// 通过 alert 帮我打印
// let num3 = getMax(6, 8);
alert(getMax(6, 8));
</script>
</body>
</html>
函数返回值的使用案例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no"
/>
<title>16-函数返回值的案例.html</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
</style>
</head>
<body>
<script>
let arr1 = [1, 3, 4, 33, 22];
// 声明一个函数 用来计算数组的最大值 并且 最大值 返回
function getMax(arr) {
let max = arr[0];
for (let index = 0; index < arr.length; index++) {
if (arr[index] > max) {
max = arr[index];
}
}
return max;
}
let max = getMax(arr1);
console.log(max); // max 该数组的最大值 !
// 声明一个函数 用来计算数组的最小值
function getMin(arr) {
let min = arr[0];
for (let index = 0; index < arr.length; index++) {
if (arr[index] < min) {
min = arr[index];
}
}
return min;
}
let min = getMin(arr1);
console.log(min); // min 输出数组的最小智
</script>
</body>
</html>
返回值的补充
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no"
/>
<title>17-函数返回值补充.html</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
</style>
</head>
<body>
<script>
/*
1 不能同时执行多次return 第一个return生效
2 函数内部 如果写了return ,那么它下面的代码就不会执行!!
3 如果一个函数 没有写return 相当于 写了 return undefined
*/
function getMax() {
return undefined;
}
let num = getMax();
console.log(num);
</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>Document</title>
</head>
<body>
<script>
function func1() {
console.log('func1');
func2();
}
function func2() {
console.log('func2');
func3();
}
function func3() {
console.log('func3');
}
func1(); // 三个函数都输出
</script>
</body>
</html>
作用域
作用域的简单演示
作用域的个人理解:分为全局作用域和局部作用域即可,全家就是在script标签里面的就是全局,作用于整个script内部
这里指同名元素,一般我们很少人为创造这样的情况; 局部就是函数之类内部的,作用于内部,但是内部没有会就近原则,找自己的父元素,如果没有就会找全局
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no"
/>
<title>18-作用域的简单演示.html</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
</style>
</head>
<body>
<script>
// script标签内的运行环境就是全局作用域
let num = 100; // 全局作用域
function getMax() {
// 这个区域内就不属于全局作用域
// 局部作用域 或者 也叫做 函数作用域
let num2 = 200;
}
for (let index = 0; index < 4; index++) {
// 块级作用域
}
while (true) {
// 块级作用域
}
if (true) {
// 块级作用域
}
</script>
</body>
</html>
作用域链
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no"
/>
<title>27-作用域链-测试.html</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
</style>
</head>
<body>
<script>
// let num = 100;
// function func1() {
// let num = 200;
// fun2();
// }
// function fun2() {
// let num = 300;
// console.log(num); // 300
// }
// func1();
// 判断当前变量 输出是什么
// 就近原则 判断是要根据 函数的定义 来判断 而不是函数的调用
// 函数的定义 代码位置来判断 100 这个!!
let num = 100;
function func1() {
let num = 200;
// 函数的调用
fun2();
}
// 函数的定义-声明
function fun2() {
console.log(num);
}
func1();
</script>
</body>
</html>
变量
全局变量
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no"
/>
<title>29-全局变量.html</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
</style>
</head>
<body>
<script>
// 定义一个变量 没使用 let 关键字 那么它就是一个全局变量
// 都建议 定义变量的时候 都要记得使用let ,不用去记这么规则
// userName = '索隆';
// console.log(userName);
function func1() {
// userName = '索隆'; // 全局变量 没有使用let 关键字
let userName = '索隆'; // 局部变量
}
func1();
console.log(userName); //
</script>
</body>
</html>
变量的使用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no"
/>
<title>23-变量的使用.html</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
</style>
</head>
<body>
<script>
// 在同一个作用域内 声明两个同样变量 就会出错。
// 全局变量
// let num = 100;
// let num = 200;
// function getMax() {
// let num = 100;
// }
// function getMin() {
// let num = 200;
// }
// for (let index = 0; index < 2; index++) {
// let num = 100;
// console.log("第一次循环,",num);
// }
// for (let index = 0; index < 2; index++) {
// let num = 100;
// console.log("第二次循环,",num);
// }
let arr1 = [1, 3, 4, 33, 22];
function getMax(arr) {
let max = arr[0];
for (let index = 0; index < arr.length; index++) {
if (arr[index] > max) {
max = arr[index];
}
}
return max;
}
function sdfdf(params) {
}
</script>
</body>
</html>
匿名函数
了解即可,就是没有名字的函数,但是用法和函数一样,如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no"
/>
<title>30-匿名函数-了解.html</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
</style>
</head>
<body>
<script>
// 函数按照有没有名字 分成两种
// 有名字 具名函数
// 没有名字 匿名函数
// 具名函数 函数名称 func1
// function func1() {
// }
// 匿名函数 = function () {}; 匿名函数 了解即可
// let func2 = function () {}; 叫做 函数表达式
// 表达式 可以表示结果的一段代码 函数表达式 了解
let func2 = function () {
console.log("123");
};
// 调用
func2();
</script>
</body>
</html>
自执行函数
就是一次性函数,写法就是两个括号,然后再第一个括号把匿名函数丢进去,写法如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no"
/>
<title>31-自执行函数-了解.html</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
</style>
</head>
<body>
<script>
/*
自执行函数 = 匿名函数一起出现 通用的功能是 防止变量污染
函数在定义的同时 直接就执行了
用在哪里呢
适合做一次性的任务- 不希望这个函数可以得到复用!!!
函数包装多段代码 让程序比较简洁
1 页面打开时候
1 设置 页面的标题 = 月薪过万
2 设置 页面的背景颜色 = 黄色
*/
// 匿名函数
// function () {
// // 设置 页面的标题 = 月薪过万
// document.title = '月薪过万';
// // 设置 页面的背景颜色 = 黄色
// document.body.style.backgroundColor = 'yellow';
// }
// let msg = 123;
// // 自执行函数
// (function () {
// let msg = 123;
// // 设置 页面的标题 = 月薪过万
// document.title = '月薪过万';
// // 设置 页面的背景颜色 = 黄色
// document.body.style.backgroundColor = 'yellow';
// })();
// console.log(msg);
</script>
</body>
</html>