js入门(6)函数,递归,闭包
函数
函数的定义和调用
函数的定义
- 和变量类似,函数必须先定义然后才能使用
- 使用function关键字定义函数,function是"功能"的意思
函数的调用
- 只需要在函数名后面加()即可
函数声明的提升
第二种相当于提升变量,所以不可以
函数优先提升
函数的参数和返回值
参数
- 参数是函数内的待定值,在调用函数时,必须传入参数的具体值
- 函数的参数可多可少,函数可以没有参数,也可以有多个参数,多个参数之间用逗号隔开
- 当实参不足时
arguments
- 他表示它接受到的实参列表,它时一个类数组对象
- 类数组对象:所有属性均为从0开始的自然数序列,并且有length属性,和数组类似可以用方括号下标访问对象的某个属性值,但是不能调用数组的方法
- 可以计算用户传的参数的总和
返回值
- 函数体内可以使用return关键字表示"函数的返回值"
- 函数如果有return语句,就必须定义一个变量来接收
遇见ruturn会退出函数
- 相当于break
函数算法题
- 寻找喇叭花数:每一位阶乘和等于他本身,寻找所有喇叭花数
可以写一个累乘的函数来实现
/*先写一个累乘的函数*/
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分别表示靠前靠后的两项,如果需要他们交换位置,返回任意正数,否则返回任意负数
两种都可以实现从小到大排序
递归
- 就是函数调用自身
- 边界条件:必须有递归出口
- 递归模式:大的问题分解成小的问题,称为递归体
递归算法题
- 斐波那契数列
实现深克隆
- 使用递归思想,:如果遍历的是基本类型值,直接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
学不明白,我不理解
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了