前言: 完成以下练习
编写代码:计算 1-100 相加并输出结果, 计算 20-80 相加,并输出结果, 计算 100-200 相加,并输出结果
var sum1 = 0;for (var i = 1; i <= 100; i++) {sum1 += i;}console.log(sum1)var sum2 = 0;for (var i = 20; i <= 80; i++) {sum2 += i;}console.log(sum2)var sum3 = 0;for (var i = 100; i <= 200; i++) {sum3 += i;}console.log(sum3)
没学函数前, 我们可能会写三遍 for 循环, 有了函数之后只需要写一遍即可.
function sum(min, max) {var sum = 0;for (var i = min; i <= max; i++) {sum += i;}return sum;}console.log(sum(1, 100));console.log(sum(20, 80));console.log(sum(100, 200));
(一)函数的声明函数的作用
1.1 封装多行语句,可以重复使用,类型为 function
1.2 声明函数和调用函数
<script>// 声明函数function sayHeloo() {console.log('hello1');console.log('hello2');console.log('hello3');console.log('hello4');console.log('hello5');console.log('hello6');}// 调用函数sayHeloo();// 声明函数 1到100累加function sum() {var sum = 0;for (var i = 1; i <= 100; i++) {sum += i;}console.log(sum);}// 调用函数sum();</script>
1.3 对象中的函数(方法), alert 就是 window 对象的一个方法
<script>var obj = {name: 'laohu',age: 100,say: function() {console.log('我是laohu');}}// 在对象里调用函数, 对象里的函数我们称之为对象的方法obj.say();</script>
(二)函数的调用方式
2.1 手动调用
<script>function say() {console.log('hello');}// 手动调用say();</script>
2.2 绑定一个事件来调用(这里的函数叫: 监听器, 事件句柄
2.3 需求: 从页面上输入两个加数,绑定事件,加上两个加数相加的结果,并显示在页面上
<body><input value="" type="text" id="num1"> + <input type="text" id="num2"> = <input type="text" id="sum"><p><button onclick="add()">相加</button></p><script>function add() {// 获取元素阶段var $num1 = document.getElementById('num1');var $num2 = document.getElementById('num2');var $sum = document.getElementById('sum');// 获取input标签的值var num1 = $num1.value;var num2 = $num2.value;var sum = Number(num1) + Number(num2);$sum.value = sum;}</script></body>
(1) 获取元素节点 document.getElementById('xxx')(2) 获取input标签的值
(三)函数传递参数
3.1 调用时传入的数据,跟函数的参数一一对应, 调用的时候没有传所需要的参数, 该参数的值为undefined
<script>// 实现任意两个数相加的功能// 参数num1和参数num2叫形参function add(num1, num2) {var sum = num1 + num2;console.log(sum);}// 参数5和8, 叫做实参add(5, 8);add(100, 200);console.log('------任意两个数累加------')//任意两个数累加function add2(a, b) {var sum = 0;for (var i = a; i <= b; i++) {sum += i;}console.log(sum);}// add2(1, 100);// add2(20, 80);// add2(100, 200);add2(100); // a的值为100, b的值为undefined</script>
3.2 函数和变量声明提前
<script>// 函数声明提前add(100, 200);function add(a, b) {var sum = a + b;console.log(sum);}</script>
<script>// 变量需要先声明后使用// 变量声明提前, 然后再赋值alert(num);console.log(22222);console.log(22222);console.log(22222);debugger;var num = 100;alert(num);</script>
3.3 基本数据类型和引用数据类型参数的区别
<script>// 基本数据类型参数传递function add(a, b) {var sum = a + b;a = 11;b = 22;console.log(sum);}var num1 = 10;var num2 = 20;add(num1, num2);console.log('a:' + num1, 'b:' + num2);debugger;function test(obj) {console.log(111);console.log(222);obj.age = 200;}var person = {name: 'lh',age: 100}test(person);console.log('age:', person.age); //</script>
(四)函数返回值
4.1 使用 return 返回计算的结果
<script>function add(a, b) {var sum = a + b;return sum;}var aa = add(10, 20);alert(aa);</script>
4.2 没写 return,默认返回 undefined
<script>function say() {console.log('hello');}say();</script>
<script>var age = prompt();// 先转成数字age = Number(age);// age的值是NaN,结果为true, 否则为falseif (isNaN(age)) {alert('请输入数字');return false;/////////////////////////妙用}if (age < 0) {alert('请输入大于或等于0的数字');return false;}// 进行年龄分段的判断if (age < 6) {alert('这是个婴儿');} else if (age < 12) {alert('这是个少儿');} else if (age < 17) {alert('这是个青少年');} else if (age < 45) {alert('这是个青壮年');} else if (age < 69) {alert('这是个中年人');} else {alert('这是个老年人');}</script>
4.3 alert(), console.log(), Number(), String(); 调用结束后为什么有个”undefined”出现
4.4 return 之后的代码不执行
<script>function test() {console.log(1);console.log(2);return 222;console.log(3);}test();</script>
(五)作用域
5.1 什么是作用域
demo1.js文件var a = 10;var b = 20;
demo1.2.js文件console.log('我是demo1.2');console.log(a);console.log(b);
<body><script src="./demo1.js"></script><script src="./demo1.2.js"></script></body>
5.2 window,全局作用域,在全局作用域下声明的变量是全局变量
5.3 局部作用域和局部变量: 函数内部就是局部作用域, 在函数内部声明的变量就是局部变量
<script>function add() {var num1 = 100;var num2 = 200;console.log(num1 + num2);}console.log(num1); // 报错,因为num1是局部作用域, 只能在add函数内访问add();</script>
5.4 作用域访问规则
<script>// 作用链: 要访问一个变量, 首先从本函数开始寻找, 找不到,就沿着作用域链一级一级向上找, 一直找到window,若没有,就把报错var color = '红色';function getColor() {var color = '青色';var color2 = '蓝色';function test() {var color3 = '绿色';console.log(color);console.log(color2);console.log(color3);console.log(color4);}test();}getColor();// (2)函数外部不可以访问函数内部的变量//console.log(color2); // 会报错</script>
<script>var sum = 0;for (var i = 0; i < 5; i++) {sum += i;}console.log('sum=' + sum)console.log('i=', i); // i是全局变量,不是局部变量if (0) {var x = 100;}console.log(x); // undefined, 因为变量声明提前</script>
(1)函数内部可以访问函数外部的变量(2)函数外部不可以访问函数内部的变量(3)多个作用域用作用域链进行连接(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>Document</title>/////////////////第一步<link rel="stylesheet" href="https://unpkg.com/swiper/swiper-bundle.min.css"></head><body>///////////////第二步<div class="swiper-container"><div class="swiper-wrapper"><div class="swiper-slide"><img src="https://static.maizuo.com/v5/upload/2fd9cd71b8b73608d28d38435f45ed48.jpg" alt=""></div><div class="swiper-slide"><img src="https://static.maizuo.com/v5/upload/b43a16925b3c56107bec4b866a2623ca.jpg" /></div></div><!-- 如果需要分页器 --><div class="swiper-pagination"></div></div>////////////////第三步<script src="https://unpkg.com/swiper/swiper-bundle.min.js"></script><script>var mySwiper = new Swiper('.swiper-container', {loop: true, // 循环模式选项// 如果需要分页器pagination: {el: '.swiper-pagination',},})</script></body></html>
- 使用函数的方式重写电影列表页面, 同时加上轮播图
- 编写一个计算器(eval 用来计算)
