函数基本使用

1) 什么是函数

image.png

2) 函数的定义和调用

函数的定义

image.png
image.png

函数表达式

image.png

函数的调用

image.png

  1. //定义函数,定义的函数是不会直接执行的
  2. function fun() {
  3. console.log('你好');
  4. console.log('我是');
  5. }
  6. function fu() {
  7. console.log('你好');
  8. }
  9. //函数必须要等到调用的时候才能被执行
  10. fun();
  11. fu();

image.png

语句执行顺序

image.png
image.png

函数声明的提升

image.png

函数表达式不能提升

image.png

函数优先提升

image.png

3) 函数的参数和返回值

image.png

函数的参数

形实结合image.png

image.png

形参和实参个数不同的情况

image.png
image.png

案例

image.png

  1. //定义一个函数,这个函数的功能就是计算a到b之间所有整数的和
  2. function calcSumFromAtoB(a,b){
  3. for(var i=a,sum=0;i<=b;i++){
  4. sum+=i;
  5. }
  6. console.log('从'+a+'到'+b+'的所有整数和是'+sum);
  7. }
  8. calcSumFromAtoB(3,7);

arguments

image.png

  1. function fun(){
  2. console.log(arguments);
  3. }
  4. fun(1,23,4,45,35,2);
  1. //不管用户传入多少个实际参数,永远能够计算它们的和
  2. function fun() {
  3. for (var i = 0, sum = 0; i < arguments.length; i++) {
  4. sum += arguments[i];
  5. }
  6. console.log('所有参数的和是' + sum);
  7. }
  8. fun(1, 23, 4, 45, 35, 2);

函数的返回值

image.png

  1. //函数的功能是返回两个参数的和
  2. function sum(a,b){
  3. return a+b;
  4. }
  5. var result=sum(3,4);
  6. console.log(result);

image.png

遇见return即退出函数

image.png
image.png

  1. //书写一个函数,函数的功能判断一个数字是否是偶数
  2. function checkEven(n) {
  3. if (n % 2 == 0)return true;
  4. return false;
  5. }
  6. var result = checkEven(7);
  7. console.log(result);

函数像一个“小工厂”

image.png

函数算法题

1) 函数算法题1

image.png

  1. //计算一个数字的阶乘
  2. function factorial(n) {
  3. //累乘器
  4. var result = 1;
  5. for (var i = 1; i <= n; i++) {
  6. result *= i;
  7. }
  8. return result;
  9. }
  10. //穷举法,从100到999寻找喇叭花数
  11. for (var i = 100; i < 1000; i++) {
  12. //把数字i变为字符串
  13. var i_str = i.toString();
  14. //a、b、c分别表示百位、十位、个位
  15. var a = Number(i_str[0]);
  16. var b = Number(i_str[1]);
  17. var c = Number(i_str[2]);
  18. //根据喇叭花数的条件,来判断
  19. if (factorial(a) + factorial(b) + factorial(c) ==i) {
  20. console.log(i);
  21. }
  22. }

2) 函数算法题2

image.png
image.png

  1. var arr = [11, 24, 5, 4, 65];
  2. //排序
  3. arr.sort(function (a, b){
  4. if (a > b) {
  5. return 1;
  6. } else {
  7. return -1;
  8. }
  9. });
  10. console.log(arr)

递归

1) 什么是递归

递归

image.png

用求4的阶乘举例

image.png

递归的要素

image.png

  1. //书写一个函数,这个函数内部自己会调用自己,从而形成递归。
  2. function factorial(n) {
  3. //函数的功能是计算n的阶乘,n!不就是n*(n-1)!么?
  4. //这个就是递归的出口,如果计算1的阶乘,可以不用递归了直接告诉答案就是1
  5. if (n == 1) return 1;
  6. //如果询问的不是1的阶乘,就返回n*(n-1)
  7. return n * factorial(n - 1);
  8. }
  9. var result = factorial(4);
  10. console.log(result);

2) 递归常见算法题

image.png

  1. //编写一个函数,这个函数的功能是返回斐波那契数列中下标为n的那项的值
  2. function fib(n) {
  3. //数列的下标为0和下标为1的项值是1
  4. if (n == 0 || n == 1) return 1;
  5. //斐波那契数列的本质特征就是每一项,都等于前面两项的和
  6. return fib(n - 1) + fib(n - 2);
  7. }
  8. //书写一个循环语句,计算斐波那契数列的前十五项
  9. for(var i=0;i<15;i++){
  10. console.log(fib(i));
  11. }

3) 实现深克隆

复习引用类型值的相关知识

image.png

复习浅克隆

image.png

实现深克隆

image.png

  1. //原数组
  2. var arr1 = [1, 23, 3, [1, 2]]
  3. //函数,这个函数会被递归
  4. function deepClone(arr) {
  5. //结果数组
  6. var result = [];
  7. //遍历数组的每一项
  8. for (var i = 0; i < arr.length; i++) {
  9. //类型判断,如果遍历到的项是数组
  10. if (Array.isArray(arr[i])) {
  11. //递归
  12. result.push(deepClone(arr[i]));
  13. } else {
  14. //如果遍历到的项不是数组,是基本类型值,就直接推入到结果数组中
  15. //相当于是递归的出口
  16. result.push(arr[i]);
  17. }
  18. }
  19. //返回结果数组
  20. return result;
  21. }
  22. //测试一下
  23. var arr2=deepClone(arr1);
  24. console.log(arr2);

作用域和闭包

1) 全局变量和局部变量

变量作用域

image.png

全局变量

image.png

遮蔽效应

image.png

注意考虑变量声明提升的情况

image.png

形参也是局部变量

image.png

作用域链

image.png
image.png

不加var将定义全局变量

image.png

2) 闭包

从一个题目开始

image.png

  1. //创建一个函数
  2. function fun() {
  3. //定义局部变量
  4. var name = '慕课网';
  5. //返回一个函数
  6. return function () {
  7. alert(name);
  8. }
  9. }
  10. //调用外部函数,就能得到内部函数
  11. var inn = fun();
  12. //执行inn函数,就相当于在fun函数的外部,执行了内部函数
  13. inn();

什么是闭包

image.png
image.png
image.png

观察闭包现象

image.png

闭包非常实用

image.png

闭包用途 记忆性

image.png

闭包的记忆性举例

image.png

  1. function createCheckTemp(standardTemp){
  2. function CheckTemp(n){
  3. if (n<=standardTemp){
  4. alert('你的体温正常')
  5. }else {
  6. alert('你的体温偏高')
  7. }
  8. }
  9. return CheckTemp;
  10. }
  11. //创建一个CheckTemp函数,它以37.1度为标准线
  12. var CheckTemp_A=createCheckTemp(37.1);
  13. //创建一个CheckTemp函数,它以37.3度为标准线
  14. var CheckTemp_B=createCheckTemp(37.3);
  15. CheckTemp_B(37.2);

闭包用途 模拟私有变量

image.png

  1. //封装一个函数,这个函数的功能就是私有化变量
  2. function fun(){
  3. //定义一个局部变量
  4. var a=0;
  5. return {
  6. getA:function(){
  7. return a;
  8. },
  9. add:function(){
  10. a++;
  11. },
  12. pow:function(){
  13. a*=2;
  14. }
  15. };
  16. }
  17. var obj=fun();
  18. //如果想在fun函数外面使用变量a,唯一的方法就是调用getA()方法
  19. console.log(obj.getA());
  20. //想让变量a进行加1操作
  21. obj.add();
  22. obj.add();
  23. obj.add();
  24. console.log(obj.getA());

使用闭包的注意点

image.png