闭包
function fn () {
var b = new Array(200000).fill('Green')
function closure(){
debugger;
// 访问外部变量b
console.log(b);
}
closure(); // 触发闭包形成
}
- 如代码,我们可能会想到闭包的存活周期有多久?
-
- 只要对应closure函数没有被引用,随着fn函数执行结束,closure函数(闭包)也将结束
高阶函数
function fn () {
return function(){}
}
应用场景
- 内部函数引用外部变量 + 内部函数向外暴露 = 内部函数只要不销毁,就可以持续访问到外部函数的变量 让数据持久,但又不至于到全局,引起全局命名冲突
递归
- 程序调用自身的编程技巧称为递归( recursion)
function fn() {
fn(); // 无限递归调用, stack overflow}
}
避免栈内存溢出的递归必要处理条件(二选一)
(一)设置递归条件
var i = 0;function fn() {
if (i++ < 10) {
// 避免无限递归调用, stack overflow
fn();
}}
(二)设置函数结束条件
var i = 0;
function fn() {
if (i++ > 10)return;
// 避免无限递归调用, stack overflow
fn();
}
递归返回值【难点】😫
斐波那契数列
- 在第一个月时,只有一对小兔子,过了一个月,那对兔子成熟了,在第三个月时便生下
- 一对小兔子,这时有两对兔子。再过多一个月,成熟的兔子再生一对小兔子,而另一对小兔子长大,有三对小兔子
![图片](https://img-blog.csdnimg.cn/img_convert/6be3e6ea297f75e1bdbaa5914cc68c59.webp?x-oss-process=image/format,png)
分析
- 从结果探寻规律是编程人员常用的技巧:看【兔子总数】,由 1 => 1 => 2 => 3 => 5 => 8(别管TM的兔子怎么弄,只看结果🤣)
- 规律就是__初始1和1, 后续的结果为前两个数的和__,这个思路你学废了吗?😎
非递归实现
function fibonacci(n) {
var n1 = 1, n2 = 1, sum;
for (let i = 2; i < n; i++) {
sum = n1 + n2
n1 = n2
n2 = sum
}
return sum}
fibonacci(5)
递归实现
- 第五次的结果 = 第四次 + 第三次
- 看图得知:第一次、第二次都为1, 所以【1 、 1 、 2 、 3】 ,最后结果为5
function fibonacci(n) {
if (n === 1 || n === 2) return 1;
return fibonacci(n-2) + fibonacci(n-1);
}
fibonacci(5)