js入门(6)函数,递归,闭包

函数

函数的定义和调用

函数的定义

  • 和变量类似,函数必须先定义然后才能使用
  • 使用function关键字定义函数,function是"功能"的意思

函数的调用

  • 只需要在函数名后面加()即可

函数声明的提升



第二种相当于提升变量,所以不可以

函数优先提升

函数的参数和返回值

参数

  • 参数是函数内的待定值,在调用函数时,必须传入参数的具体值
  • 函数的参数可多可少,函数可以没有参数,也可以有多个参数,多个参数之间用逗号隔开
  • 当实参不足时

arguments

  • 他表示它接受到的实参列表,它时一个类数组对象
  • 类数组对象:所有属性均为从0开始的自然数序列,并且有length属性,和数组类似可以用方括号下标访问对象的某个属性值,但是不能调用数组的方法

  • 可以计算用户传的参数的总和

返回值

  • 函数体内可以使用return关键字表示"函数的返回值"
  • 函数如果有return语句,就必须定义一个变量来接收

遇见ruturn会退出函数

  • 相当于break

函数算法题

  1. 寻找喇叭花数:每一位阶乘和等于他本身,寻找所有喇叭花数
    可以写一个累乘的函数来实现
    /*先写一个累乘的函数*/
    function  leicheng(n) {
        var x=1;
        for (var i=1;i<=n;i++){
            x*=i;
        }
        /*要有返回值!!!*/
        return x;
    }
    /*拆分三位数,然后计算*/
    for (var i=100;i<1000;i++){
        /*使用字符串取出个位十位百位*/
        var i_s=String(i);
        if(i===leicheng(Number(i_s[0]))+leicheng(Number(i_s[1]))+leicheng(Number(i_s[2]))){
            console.log(i);
        }
    }

sort()方法

  • 数组排序可以用sort()方法,这个方法的参数是一个函数
  • 函数中啊,b分别表示靠前靠后的两项,如果需要他们交换位置,返回任意正数,否则返回任意负数


    两种都可以实现从小到大排序

递归

  • 就是函数调用自身
  • 边界条件:必须有递归出口
  • 递归模式:大的问题分解成小的问题,称为递归体

递归算法题

  1. 斐波那契数列

实现深克隆

  • 使用递归思想,:如果遍历的是基本类型值,直接push(),否则又是重复执行浅克隆
    /*深克隆
    * 创建一个多层数组
    * 创建一个函数
    * 创建一个结果数组
    * for循环,遍历数组的每一项
    * 判断,如果遍历到的项是数组
    * 递归:返回值push到函数中
    * 如果不是,直接push到数组
    * 最后返回结果数组*/
    var shenArr=[1,2,3,4,5,6,7,[8,9,0,[11,12,13,14,[15,16,17,18]]]];
    function copy(Arr) {
        var jieguo=[];
        for(var i=0;i<Arr.length;i++){
            if (Array.isArray(Arr[i])){
                jieguo.push(copy(Arr[i]))
            }else {
                jieguo.push(Arr[i])
            }
        }
        return jieguo;
    }
    var Arr1=copy(shenArr);
    document.write(Arr1);

救命我还是不会,会了但不完全会

局部变量和全局变量

  • 如果不在任何函数内就是全局变量
  • 如果函数内外有同名变量,函数里面的变量起作用
  • 需要考虑便变量声明提升的问题
  • 如果在函数内部创建一个变量,如过没有var,那么他将会变成全局变量

闭包

  • 是函数本身,和该函数声明时所处的环境状态的组合
  • 函数可以记住定义时所处的环境,即使函数不在定义的环境中被调用,也能访问定义时所处的环境
  • 每次创建函数时都会创建闭包
  • 当函数换一个地方执行时才能被观察到

案例

  • var ceshi11=ceshi1(2);相当于内部的函数被调用到了外部,但是不会被执行,需要再次把内部的函数进行调用

    此时会输出
  • 此时x会被带入1,y会被带入2,3,z会被带入3,4,4

闭包的记忆性

  • 当闭包产生时,函数所处的状态会始终保持在内存中,不会再外层函数调用时自动被清除,这就是闭包的记忆性

    输出

    最后一条语句的5是最先输出的,定时器需要执行5次,但是for是在一瞬间执行完毕的,所以i++还得再执行5次

闭包模拟私有变量

让变量a只能加和乘


不能滥用闭包,会造成网页性能的问题,严重的会内存泄漏

题目


输出:1122

立即执行函数IIFE

  • 立即调用函数表达式,是一种特殊的js函数写法,一旦被定义会立即被调用
  • 函数是不能直接加()被调用的
  • 所以函数必须加()转为函数表达式

作用

  • 为变量赋值
  • 将全局变量变成局部变量

    会弹出5,因为用的是同一个i

    弹出2
    学不明白,我不理解
posted @   zongkm  阅读(105)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示