今日学习任务

  • [ ] 01-案例:动态生成柱状图

  • [ ] 02-能够使用循环结构数组遍历应用

  • [ ] a.数组遍历输出

  • b.反转数组
  • c.嵌套循环遍历
  • [ ] 03-函数

  • [ ] a.掌握函数的基础语法

  • b.理解函数的实际应用
  • c.掌握函数的形参、实参和返回值的作用
  • d.掌握js的外联引入方式

01-循环结构应用场景练习

1.1-动态生成柱状图

  • 允许用户输入要生成的柱状图数量
  • 随机生成柱状图的每个柱子的高度(实际开发从后台获取)
  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>Document</title>
  7. <style>
  8. * {
  9. margin: 0;
  10. padding: 0;
  11. }
  12. /* 父盒子 */
  13. .box {
  14. /* 子盒子要绝对定位,父盒子相对定位 */
  15. position: relative;
  16. margin: 100px auto;
  17. width: 1200px;
  18. height: 200px;
  19. border: 1px solid skyblue;
  20. }
  21. /* 子盒子 */
  22. .dis {
  23. position: absolute;
  24. text-align: center;
  25. }
  26. </style>
  27. </head>
  28. <body>
  29. <script>
  30. /*
  31. 动态生成用人输入数量的柱状图
  32. 思路分析
  33. 1.设计div包括和显示柱子
  34. 1.1.柱子包含在大的div中:box
  35. 1.2.柱子要平铺在box中,对小柱子(内部div)定位
  36. 2.获取用户输入的柱子数量
  37. 3.为了让柱子之间有间隔,也让柱子不挨着两边:计算柱子的间距(空白柱子分隔)
  38. 3.1.计算柱子数量:图形柱子 + 空白柱子
  39. 3.2.计算柱子宽度:铺满整个空间
  40. 4.动态生成柱形图
  41. 4.1.空白柱子高度填满父盒子,背景透明
  42. 4.2.数据柱子颜色随机,高度随机
  43. 5.输出柱形图
  44. */
  45. //2.获取用户输入的柱子数量
  46. let num = +prompt('请输入柱形图数量:');
  47. //3.为了让柱子之间有间隔,也让柱子不挨着两边:计算柱子的间距(空白柱子分隔)
  48. //3.1.计算柱子数量:图形柱子 + 空白柱子
  49. let picNum = num * 2 + 1;
  50. //3.2.计算柱子宽度:铺满整个空间
  51. let divWidth = 1200 / picNum;
  52. //4.动态生成柱形图
  53. let divs = '<div class="box">';
  54. //循环要生成的柱子数量
  55. for (let i = 0; i < picNum; i++) {
  56. //计算每个柱子的偏移量:绝对定位的left距离
  57. let left = divWidth * i;
  58. // 偶数为透明柱子,奇数为图形柱子
  59. if (i % 2 == 0) {
  60. //4.1.空白柱子高度填满父盒子,背景透明
  61. divs += `
  62. <div class="dis" style="width:${divWidth}px;height:200px;background-color:transparent;left:${left}px;top:0"></div>
  63. `;
  64. } else {
  65. //4.2.数据柱子颜色随机,高度随机
  66. //随机产生高度
  67. let divHeight = Math.ceil(Math.random() * 200);
  68. //随机产生颜色
  69. let red = green = blue = 0;
  70. //按照柱子的高度来分配颜色:高度低于60,深色区间80;高度大于60 小于120,中色区间80 - 160,高度大于120,浅色区间160-240
  71. if (divHeight < 60) {
  72. //深色区间:80
  73. red = Math.random() * 80;
  74. green = Math.random() * 80;
  75. blue = Math.random() * 80;
  76. } else if (divHeight < 120) {
  77. //中色区间80-160
  78. red = Math.random() * 80 + 80;
  79. green = Math.random() * 80 + 80;
  80. blue = Math.random() * 80 + 80;
  81. } else {
  82. //浅色区间160-240
  83. red = Math.random() * 80 + 160;
  84. green = Math.random() * 80 + 160;
  85. blue = Math.random() * 80 + 160;
  86. }
  87. //将产生的柱子div绑定到父盒子内部
  88. //需要对每个柱子增加宽度divWidth,盒子高度divHeight,颜色rgb,偏移量left
  89. divs += `
  90. <div class="dis" style="width:${divWidth}px;height:${divHeight}px;background-color:rgb(${red},${green},${blue});left:${left}px;"></div>
  91. `;
  92. /*
  93. 正常柱状图应该是下面平行,上面显示锯齿,怎么实现?锯齿的Y轴偏移量top
  94. */
  95. }
  96. }
  97. //拼凑完整父盒子
  98. divs += '</div>';
  99. //5.输出柱形图
  100. document.write(divs);
  101. </script>
  102. </body>
  103. </html>

02-数组练习

1.1-数组练习1

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7. <title>Document</title>
  8. </head>
  9. <body>
  10. <script>
  11. /*1.求数组中元素的平均值
  12. 2.求数组中元素的最大值
  13. 3.求数组中元素的最小值
  14. 4.将1-100中3的倍数放入数组中
  15. */
  16. //1.求数组中元素的平均值
  17. let arr = [98,59,99,60,100];
  18. //(1)声明空箩筐
  19. let sum = 0;
  20. //(2)遍历萝卜堆数
  21. for(let i = 0;i<arr.length;i++){
  22. //(3)添加到箩筐
  23. sum += arr[i];
  24. };
  25. console.log(sum / arr.length);
  26. //2.求数组中元素的最大值
  27. let arr = [98,59,99,60,100];
  28. //(1)声明空擂主
  29. let max = -Infinity;
  30. //(2)遍历挑战者
  31. for(let i = 0;i<arr.length;i++){
  32. //(3)挑战者依次和擂主PK
  33. if(arr[i] > max){
  34. max = arr[i];
  35. };
  36. };
  37. console.log(max);
  38. //3.求数组中元素的最小值
  39. //4.将1-100中3的倍数放入数组中
  40. //思路:遍历指定范围符合条件的数
  41. let arr = [];
  42. for(let i = 1;i<=100;i++){
  43. if(i%3==0){
  44. arr[arr.length] = i;
  45. };
  46. };
  47. console.log(arr);
  48. </script>
  49. </body>
  50. </html>

1.2-数组练习2(翻转数组)

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7. <title>Document</title>
  8. </head>
  9. <body>
  10. <script>
  11. /*1.翻转数组
  12. */
  13. //1.翻转数组
  14. let arr = [20, 25, 66, 88, 90];//[90,88,66,25,20]
  15. /*
  16. 1.1 翻转法
  17. (1)声明空数组newArr
  18. (2)倒着遍历arr,添加到空数组中
  19. */
  20. // //1.声明空数组newArr
  21. // let newArr = [];
  22. // //2.倒着遍历arr,添加到空数组中
  23. // for(let i = arr.length-1;i>=0;i--){
  24. // console.log(arr[i]);
  25. // newArr[newArr.length] = arr[i];
  26. // };
  27. // console.log(newArr);
  28. /*
  29. 1.2 交换法
  30. (1)遍历数组一半
  31. (2)下标为 i元素 与 下标为 arr.length-1-i 元素交换
  32. */
  33. //1.遍历数组的一半
  34. for (let i = 0; i < arr.length / 2; i++) {//i = 0 1 2
  35. //2. 下标为i元素 和 下标为arr.length-1-i元素交换
  36. let temp = arr[i];
  37. arr[i] = arr[arr.length - 1 - i];
  38. arr[arr.length - 1 - i] = temp;
  39. };
  40. console.log(arr);
  41. </script>
  42. </body>
  43. </html>

1.3-数组练习3(实际应用场景)

  • 需求:根据数组将数据加工输出到页面上
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7. <title>Document</title>
  8. </head>
  9. <body>
  10. <script>
  11. /*
  12. * 1.目前阶段的学习中,我们仅能做一些静态网页,也就是说所有的数据都是写死的
  13. * 2.实际开发中,我们通常会使用js代码从服务器请求数据加载到网页中,而这些数据通常都是数组
  14. * 3.本小节我们来学习如何根据数组的内容来产生网页的结构
  15. */
  16. //1.请求服务器,得到一个数组的数据
  17. let books = ["js语言很牛逼","C语言从入门到放弃", "编程之道:从程序员到卖麻辣烫", "颈椎病治疗指南", "JavaScript权威指南","js从入门到入坟"];
  18. // document.write('<ul><li>老铁666</li></ul>');
  19. document.write('<ul>');
  20. for(let i = 0;i<books.length;i++){
  21. document.write('<li>' + books[i] + '</li>');
  22. };
  23. // document.write('<li>' + books[0] + '</li>');
  24. // document.write('<li>' + books[1] + '</li>');
  25. // document.write('<li>' + books[2] + '</li>');
  26. // document.write('<li>' + books[3] + '</li>');
  27. // document.write('<li>' + books[4] + '</li>');
  28. document.write('</ul>');
  29. </script>
  30. </body>
  31. </html>

1.4-字符串数组访问扩展

  • 在JS中,字符串的每个符号都有一个下标,默认从0开始
  • 字符串数组访问只是可读,不能修改
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7. <title>Document</title>
  8. </head>
  9. <body>
  10. <script>
  11. /*
  12. * 1.字符串的组成符号也是有下标的,而且从0开始
  13. * 2.可以利用数组下标访问的特性,通过下标访问字符串的某个符号
  14. */
  15. let str = '我好想你';
  16. console.log(str[0],str[1],str[2],str[3]); // 我 好 想 你
  17. //无效
  18. //str[0] = 'I';
  19. /*
  20. * 1.可以利用字符串特性,灵活的实现水仙花数
  21. * 2.实现步骤
  22. * * 1.将数字转换成字符串
  23. * * 2.通过字符串下标访问形式,取得每个位置上的值,然后进行求立方
  24. */
  25. for (let i = 100; i <= 999; i++) {
  26. //类型转换,不影响i本身
  27. let str = String(i);
  28. if (Math.pow(str[0], 3) + Math.pow(str[1], 3) + Math.pow(str[2], 3) == i) {
  29. console.log(i);
  30. }
  31. }
  32. </script>
  33. </body>
  34. </html>

03-循环嵌套(进阶)

嵌套循环:一个循环中嵌套另一个循环

  • 嵌套循环执行的总次数 = 外层循环执行次数 * 内层循环执行次数
  • 嵌套执行逻辑:外部循环每执行一次,内部循环就要执行全部

1.1-循环嵌套练习:九九乘法表

day04 - 图1

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7. <title>Document</title>
  8. </head>
  9. <body>
  10. <script>
  11. /*
  12. 第一行 i= 1 ,列数 1
  13. 第二行 i= 2 ,列数 2
  14. 第三行 i= 3 ,列数 3
  15. ^^^
  16. i = 9 ,列数 9
  17. 内层循环次数 = i
  18. */
  19. //1.外层循环 : 行 9
  20. for(let i = 1;i<=9;i++){
  21. //2.内层循环次数 = i
  22. for(let j = 1;j<=i;j++){// i = 9 j = 1 2 3 4 5 6 7 8 9
  23. document.write(j + '*' + i + '=' + j*i + '&nbsp;&nbsp;');
  24. };
  25. document.write('<br><br>');
  26. };
  27. </script>
  28. </body>
  29. </html>

1.2-循环嵌套练习:二维数组遍历

  • 二维数组:数组本身还是一个数组
  • 二维数组遍历:先遍历外部数组,内部遍历数组元素(还是数组)

    • 一般情况下:我们都是直接遍历外部(元素个数不确定),而内部通常是直接取(数据明确长度,且有规范)
  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>Document</title>
  7. <style>
  8. .news {
  9. width: 400px;
  10. margin: 50px auto;
  11. text-align: left;
  12. }
  13. .news li {
  14. width: 100%;
  15. overflow: hidden;
  16. white-space: nowrap;
  17. text-overflow: ellipsis;
  18. }
  19. .news a {
  20. text-decoration: none;
  21. font-size: 14px;
  22. color: #222;
  23. line-height: 20px;
  24. }
  25. .news a:hover {
  26. color: #20a1f1;
  27. }
  28. </style>
  29. </head>
  30. <body>
  31. <script>
  32. //显示后台提供的新闻信息:news模拟后台返回的数据
  33. //新闻信息:news外部数组包含了很多条新闻
  34. //新闻信息:news元素都是数组,包含了分类、新闻标题、新闻链接
  35. let news = [
  36. ['要闻', '牢记初心使命 实干笃定前行', 'https://news.ifeng.com/c/7wNelHB0SgK'],
  37. ['要闻', '你以生命相托,我必全力以赴', 'https://news.ifeng.com/c/7wM1V3EzQBM'],
  38. ['要闻', '中国无人战车正式服役:机枪显示惊人杀伤力', 'https://tech.ifeng.com/c/7wMT02ftUZ4'],
  39. ['健康', '独家 | 武汉封城建议者:向武汉人民致敬,向援助武汉的人致敬', 'https://finance.ifeng.com/c/7wM0E6Bs8PI'],
  40. ['汽车', '马斯克发飙:起诉当地政府!总部搬离加州!', 'http://auto.ifeng.com/c/7wM43afWMFs'],
  41. ['汽车', '奇瑞真正的旗舰SUV,车长近5米+2.0T动力,气场不输路虎揽胜', 'https://auto.ifeng.com/c/7wIpWtWvHYv'],
  42. ['房产', '广州即将推出9宗土地 涉及22.2万平米4宗宅地', 'https://gz.house.ifeng.com/news/2020_05_11-52744145_0.shtml'],
  43. ];
  44. //制作字符串:包含div和ul的前半部分
  45. let newsStr = `
  46. <div class="news">
  47. <ul>
  48. `;
  49. //遍历数组:构造li内部的a标签
  50. for (let i = 0; i < news.length; i++) {
  51. //外部循环:确定出现的li数量
  52. //内部循环:确定li里面的a标签内容,但是实际上数据是规定的
  53. //news[i]就是一条具体的新闻数组:['要闻', '牢记初心使命 实干笃定前行', 'https://news.ifeng.com/c/7wNelHB0SgK']
  54. //news[i][0]是分类,news[i][1]是标题,news[i][2]是链接
  55. //所以这样是不需要进行内部循环遍历的
  56. //ES6模板字符串应用
  57. newsStr += `
  58. <li>
  59. <a href="${news[i][2]}">【${news[i][0]}】${news[i][1]}</a>
  60. </li>
  61. `;
  62. }
  63. // 补全标记
  64. newsStr += `
  65. </ul>
  66. </div>
  67. `;
  68. //输出
  69. document.write(newsStr);
  70. </script>
  71. </body>
  72. </html>

04-函数

函数作用:将代码存入变量中,实现代码复用

1.1-函数介绍

  • 函数是一种结构,使用function关键字声明
  • 函数不会自动运行
  • 函数定义后,需要主动调用才会触发
  1. //1.声明函数:将代码存入结构中
  2. function 函数名(){
  3. 函数体:一段代码
  4. }
  5. //2.调用函数:执行函数体代码
  6. 函数名();
  1. <script>
  2. /*1.函数与循环区别:本质区别
  3. a.作用不同:
  4. 循环:一段代码在一个地方执行多次(主动运行)
  5. 函数:一段代码在多个地方执行一次(被动运行)
  6. b.本质不同
  7. 循环:只是一种语法,让代码重复执行
  8. 函数:是一种数据类型,存储的是代码
  9. */
  10. /*2.什么样的代码需要使用函数
  11. a.这段代码需要在多个地方执行
  12. b.这段代码通常都是完成一个独立的小功能
  13. */
  14. /*3.语法误区:函数语法就两个(声明与调用)
  15. 1.声明函数: function 函数名(){ 函数体代码 }
  16. 2.调用函数: 函数名()
  17. 3.变量取值: 函数名 (不会执行函数体代码,只是以字符串形式将变量中存储的东西打印出来而已)
  18. */
  19. //需求 : 一段代码 需要在多个地方执行
  20. //复制粘贴弊端 : (1)代码冗余 (2)不便于维护
  21. /*
  22. 1.函数作用 : 实现某个功能代码的重复利用
  23. 2.函数语法
  24. a. 声明函数 : ( *** 函数体代码不会执行 ***)
  25. function 函数名(){
  26. 函数体 :一段代码
  27. };
  28. b. 调用函数 : 执行函数体代码
  29. 函数名();
  30. */
  31. //(1)声明函数:打印99乘法表
  32. function getChengFa() {
  33. //定义一个变量,保存即将产生的字符串(实用,后面return讲)
  34. let chengfaStr = '';
  35. //外层循环:控制层数
  36. for (let i = 1; i <= 9; i++) {
  37. //内存循环:控制列数
  38. for (let j = 1; j <= i; j++) {
  39. //拼接内容
  40. chengfaStr += `${j} * ${i} = ${j * i} &nbsp`;
  41. }
  42. //换行
  43. chengfaStr += '<br>';
  44. }
  45. //返回结果
  46. document.write(chengfaStr);
  47. }
  48. //(2)调用函数 : 执行函数体代码
  49. getChengFa();
  50. console.log('99乘法表,我的最爱');
  51. //(3)既然这么爱,那就再来一次
  52. getChengFa();
  53. console.log('不爱了,吐了');
  54. /*
  55. 3.函数注意点
  56. a.以后什么样的代码你会放入函数中?
  57. (1)多个地方执行
  58. (2)独立的小功能
  59. b.函数与循环 有着本质的区别
  60. (1)本质区别
  61. 函数 :是一种数据类型,存储代码
  62. 循环 :是一种语法,重复执行代码
  63. (2)作用不同
  64. 函数 : 一段代码在多个地方执行一次
  65. 循环 : 一段代码在一个地方执行多次
  66. */
  67. </script>

1.2-函数参数

  • 参数的目的是让函数能够变的灵活,可以完成不同的,但是功能类似的需求
  • 函数参数分为两种:

    • 形参:定义函数时的参数,属于占座位
    • 实参:调用函数时的参数,属于实际数据
  • 函数不会自动运行:所以先占位;调用时就是要实际运行,所以给数据
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7. <title>Document</title>
  8. </head>
  9. <body>
  10. <script>
  11. /*
  12. 1.函数作用 : 实现某个功能代码的重复利用
  13. 2.参数
  14. 2.1 参数作用 : 调用者 传递数据 给函数
  15. 2.2 语法
  16. 传 : 调用者
  17. 函数名(实参:实际参数)
  18. 收 : 函数
  19. function 函数名(形参:形式参数){ 函数体代码 }
  20. 2.3 函数传参的本质 : 实参给形参赋值
  21. * 实参和形参数量可以不一致,但是按照顺序赋值
  22. */
  23. // 2.利用函数实现指定层数的乘法表
  24. /**
  25. * @description: 得到指定层数的乘法表
  26. * @param {number} level:层数
  27. * @return: 产生的字符串
  28. */
  29. function getChengFa(level) { // level = 9
  30. //定义一个变量,保存即将产生的字符串
  31. let chengfaStr = '';
  32. //外层循环:控制层数
  33. for (let i = 1; i <= level; i++) {
  34. //内存循环:控制列数
  35. for (let j = 1; j <= i; j++) {
  36. //拼接内容
  37. chengfaStr += `${j} * ${i} = ${j * i} &nbsp`;
  38. }
  39. //换行
  40. chengfaStr += '<br>';
  41. }
  42. //返回结果
  43. document.write(chengfaStr);
  44. }
  45. //用户输入层数
  46. let level = +prompt('请输入一个要打印的乘法表的层数:');
  47. // 调用函数
  48. getChengFa(level);
  49. </script>
  50. </body>
  51. </html>
    1. 课后练习
  1. 写一个函数 求任意两个数字之间的和

1.3-函数返回值

  • 返回值是函数运行后的结果处理方式
  • 实际开发过程中,不会在函数内部进行输出,都是把结果返回给调用者

    • 函数不对结果负责:函数只负责做,至于做出来是否合适不管
  • return关键字

    • JS函数可以没有返回值
    • 可以使用return返回任意类型数据
    • return会终止函数的继续执行(结束函数运行)
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7. <title>Document</title>
  8. </head>
  9. <body>
  10. <script>
  11. /*
  12. 1.函数作用 : 将代码存入变量中,可以实现代码的复用
  13. 2.返回值
  14. 2.1 返回值 : 函数 传递数据 给调用者
  15. 2.2 语法
  16. 传 : 函数
  17. function 函数名(形参){ return 值; }
  18. 收 : 调用者
  19. let 变量名 = 函数名()
  20. */
  21. //求任意两个数字的和
  22. function getSum(a,b){
  23. let sum = a+b;
  24. console.log(sum);
  25. return sum;
  26. console.log('1111');//不会执行
  27. };
  28. //将函数调用结果显示到页面
  29. // 函数外部 无法直接 获取函数内部的变量
  30. //console.log(sum);
  31. /*函数调用工作流程 : 固定三个步骤
  32. 1. 传参
  33. 2. 执行函数体代码
  34. 3. 返回值
  35. */
  36. let res = getSum(100,50);
  37. console.log(res);
  38. /*
  39. 函数总结
  40. 1.函数几种形态
  41. 无参无返回 : 使用较少
  42. 无参有返回 : 使用不多
  43. 有参无返回 : 使用不多
  44. 有参有返回 : 使用最多
  45. 2.函数完整的工作流程(原理)
  46. a. 传参 : 调用者传递数据给函数
  47. b. 执行函数体代码
  48. c. 返回值 : 函数将结果返回给调用者
  49. 3.函数返回值语法注意点
  50. a. 如果函数没有写return,默认返回值是undefined
  51. b. 如果函数有写return,但是后面没有接值。返回值是undeifined
  52. c. 如果函数有写return,并且return后面有值。返回值就是return后面的值
  53. d. return关键字作用 : 结束函数体代码。 return后面代码不执行
  54. */
  55. </script>
  56. </body>
  57. </html>

1.4-函数另一种声明方式

  • 1.函数声明:function 函数名() {};
  • 2.函数表达式:let 函数名 = 匿名函数

    • 匿名函数:函数的字面量又称为匿名函数,顾名思义就是没有变量名的函数
    • let 函数名 = function(){};
  • 3.两者唯一区别:函数声明可以在任何地方调用,而函数表达式方式调用必须在声明后面
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7. <title>Document</title>
  8. </head>
  9. <body>
  10. <script>
  11. fn1();
  12. //1.函数声明 : function 函数名(){ 函数体代码 }
  13. function fn1(){
  14. console.log('11111');
  15. };
  16. fn1();
  17. //2.表达式声明 : let 函数名 = 匿名函数
  18. //具名函数 : 有名字的函数 匿名函数 = 没名字的函数
  19. // fn2();//报错
  20. let fn2 = function(){
  21. console.log('2222');
  22. };
  23. fn2();
  24. //3.唯一区别 : 函数声明可以在任何地方调用,表达式声明只能在声明后调用
  25. </script>
  26. </body>
  27. </html>
  1. 课后练习
  2. 1.写一个函数 n-m之间的和
  3. 2.写一个函数:求任意数组的最大值

1.5-函数练习

  • 利用函数实现对应数组的最大值元素获取
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7. <title>Document</title>
  8. </head>
  9. <body>
  10. <script>
  11. /*函数三要素
  12. 1.功能
  13. 2.参数
  14. 3.返回值
  15. */
  16. // 1.写一个函数:求任意数组的最大值
  17. /**
  18. * @description: 求任意数组最大值
  19. * @param {array} arr : 数组
  20. * @return: max:最大值
  21. */
  22. function getMax(arr) { //let arr = [88,90,100,20,66]
  23. //擂台思想
  24. let max = -Infinity;
  25. for (let i = 0; i < arr.length; i++) {
  26. if (arr[i] > max) {
  27. max = arr[i];
  28. };
  29. };
  30. return max;
  31. };
  32. let max1 = getMax([88, 90, 100, 20, 66]);
  33. console.log(max1);
  34. //注意:函数是用来实现代码复用的,函数实现的功能越小,代码的复用性越强,所以不要尝试让一个函数去解决所有问题;而是多用几个函数去实现不同功能,然后大功能调用几个小函数实现
  35. //如:数组获取最大值,获取最小值,获取平均值应该是三个不同的函数
  36. </script>
  37. </body>
  38. </html>

1.6-函数实战思想

  • 函数应该独立存在于js文件
  • 在需要使用对应函数的html中引入js文件
  1. /**
  2. * arr.js
  3. * @description: 求任意数组最大值
  4. * @param {array} arr : 数组
  5. * @return: max:最大值
  6. */
  7. function getMax(arr) { //let arr = [88,90,100,20,66]
  8. //擂台思想
  9. let max = -Infinity;
  10. for (let i = 0; i < arr.length; i++) {
  11. if (arr[i] > max) {
  12. max = arr[i];
  13. };
  14. };
  15. return max;
  16. };
  17. //可以将数组相关操作的函数封装到一个文件中,形成自己的API库
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7. <title>Document</title>
  8. <script src="js/arr.js"></script>
  9. </head>
  10. <body>
  11. <script>
  12. //直接调用引入的js文件中的函数即可
  13. let max = getMax([88, 90, 100, 20, 66]);
  14. console.log(max);
  15. </script>
  16. </body>
  17. </html>

1.7-封装自己的API库

  • 将自己所做的内容沉淀下来,供未来使用
  • 懂得根据业务进行分类
  • 数组API封装

    • 最大值
    • 最小值
    • 平均值
    • 数组翻转

05-课后作业

课后作业

  • 今日作业要求:函数都需要定义这js文件中,使用外联方式引入js

  • 1.实现柱状图(从上面生长)

  • 2.使用函数实现将数组中指定的元素去掉(★)

    • function arrTrip(数组,要去除的变量)
    • 例如:[0,10,20,30,0,40,0] 变成[10,20,30,40]:arrTrip([0,10,20,30,0,40,0] ,0)
  • 3.使用函数求出数组中是否所有的数字都是正数,打印结果(★★)

    • 例如:[10,20,30,40,50],打印:true
    • 例如:[-10,20,30,40,50],打印:false
  • 4.使用函数求出任意指定数组中的最小值(★)

  • 以下题目为循环嵌套题目(不要思维卡在数组上):使用函数完成一下作业

  • 5.大马驮2石粮食,中马驮1石粮食,两头小马驮一石粮食,要用100匹马,驮100石粮食,该如何调配?(★★★)

  • 6.小明单位发了100元的购物卡,小明到超市买三类洗化用品,洗发水(15元),香皂(2元),牙刷(5元)。要把100元整好花掉,可如有哪些购买结合?(★★★★)

  • 扩展题

  • (1) 1000~ 5000之间有多少整数,其各位数字之和为5,分别是哪些数(例如整数2003的各位数字之和为 2+0+0+3 ,等于5)),并统计满足条件的整数有多少个。(★★)

    • 如果没有思路,可以查看课外拓展求水仙花数
  • (2)猜数字游戏. 随机产生1个1-100之间的数 让用户猜(★★)

    • 当用户输入的数比产生的随机数大 就输出 猜大了 并让用户继续输入新的数.。 当用户输入的比产生的随机数小的时候 就输出 猜小了 并且继续猜 当用户刚好输入的就是这个随机数的时候 提示成功 并显示用户猜了多少次

      • a. 先产生1-100的随机数 b. 写1个循环 让用户反复不停的去猜 直到猜对结束.

1.1-寻找水仙花数

  1. /**
  2. * 水仙花数:是一个三位数,每一位的数字的三次方相加刚好等于自身
  3. * 例如: 153 = 1*1*1 + 5*5*5 + 3*3*3
  4. * = 1 + 125 + 27
  5. * = 153
  6. *
  7. * 如何知道一个三位数的百位十位个位的数字?
  8. * 例如:235
  9. * 百位(除以一百取整): (1)235/100 = 2.35 (2)parseInt(2.35) = 2;
  10. * 十位(除以10求模):(1)235/10 = 23.5 (2)parseInt(23.5)%10 = 3;
  11. * 个位(模10): 235%10 = 5;
  12. *
  13. */
  14. /*思路分析:(1)遍历所有的三位数 100-999
  15. (2)将每一位的数字三次方后相加判断是否是水仙花数
  16. (3)如果是则打印这个数,然后继续寻找
  17. (3.1)如果不是,则不打印继续寻找
  18. */
  19. for(let i = 100;i <= 999;i++){//(1)循环所有的三位数
  20. //2.判断是否是是水仙花数
  21. let bai = parseInt(i / 100); // i/100结果是小数,通过parseInt可以取整
  22. let shi= parseInt(i / 10) % 10;
  23. let ge = parseInt(i) % 10;
  24. if(Math.pow(bai,3) + Math.pow(shi,3) + Math.pow(ge,3) == i){
  25. //(3)如果是水仙花数则打印
  26. console.log ( "找到一个水仙花数:" + i );
  27. }
  28. //3.1 继续寻找
  29. }

1.2-农场繁殖

  • 农场第一年有两头牛,每两头牛每一年可以生一头小牛,小牛只需要吃草一年即可生牛,请问该农场需要多少年可以有一千头牛
  1. /**
  2. * 农场第一年有两头牛,每两头牛每一年可以生一头小牛
  3. * 小牛只需要吃草一年即可生牛,请问该农场需要多少年可以有一千头牛
  4. * * 例如
  5. * * 第一年:两头牛 1 + 1 = 2
  6. * * 第二年: 三头牛 2 + 1 = 3(生一头)
  7. * * 第三年 :四头牛 3 + 3/2 = 4(两头牛生小牛,另一头旁边观望学习经验)
  8. * * 第四年: 六头牛 4 + 4/2 = 6(两对牛各生一头小牛)
  9. * * 总结:每一年增加的小牛数是农场总牛数除以2的倍数(取整)
  10. */
  11. //1.初始两头牛
  12. let sum = 2;
  13. //2.死循环(省略条件判断),不达到一千的产量誓不罢休
  14. for(let i = 2;;i++){ //第二年开始生小牛,所以循环变量初始值是2
  15. sum += parseInt(sum/2);
  16. if(sum >= 1000){
  17. console.log("第" + i + "年,牛的数量是" + sum);//第17年,牛的数量是1066
  18. break; //完成任务,停止循环
  19. }
  20. }