面试知识点总结 - js 回调函数、闭包、递归、尾调用、尾递归

这篇博客总结了JavaScript面试中常见的知识点,包括回调函数的概念,如何创建闭包,递归和尾调用的原理,以及尾递归优化在解决栈溢出问题上的应用。此外,还提到了柯里化和蹦床函数,它们是函数式编程中的重要技巧,用于转换函数调用方式和避免深度递归导致的性能问题。最后,讨论了调用帧和调用栈在函数执行过程中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 回调函数:一个函数,参数为另一个函数,当满足某个条件是执行该参数函数
  2. 闭包:一个函数,return返回另一个函数(不是调用),在里面的函数中引用外面函数的变量
  3. 递归:函数自己调用自己
  4. 尾调用:一个函数,最后一步执行的操作是调用另一个函数,不能有任何其他操作(正确为:return fn()),return fn()+1后面有赋值操作,fn()后面有return undefined,所以都不行。只能在严格模式生效,因为非严格模式有arguments、caller等保存参数和调用该函数的函数的信息,可以跟踪函数的调用栈
  5. 尾递归:尾调用中最后一步调用的是自己
  6. 柯里化:将多参数的函数转化成单参数形式,可以使用ES6的函数参数默认值,让默认只传一个参数
  7. 蹦床函数:一个函数,接收另一个函数为参数(改参数一般为真正的逻辑代码),当该参数为函数时执行该函数。即返回一个函数,然后执行,不是在函数中调用函数。将递归执行转化为循环执行,可以减少调用帧。
  1. 调用帧:保存着函数调用位置和内部变量等信息,当在a函数中调用b函数时,a的调用帧上方就会产生b的调用帧
  2. 调用栈:递归会产生调用帧,所有调用帧就形成调用栈,很容易产生“栈溢出(Stack Overflow)”。尾调用只存在一个调用帧,可以解决栈溢出
  3. 函数内部使用严格模式:函数参数不能有默认值、解构赋值、rest参数(扩展用算符…)
function fn(){
    console.log('fn')
}
//回调函数
function test(fn){
    setTimeout(() => {
        fn()
    }, 1000);
}
test(fn)
//闭包
function test1(){
    let a = 'aa';
    return function(){
        console.log('test1',a)
    }
}
test1()()
//尾递归
function test2(n,total){
	‘use strict’;	//函数参数不能有默认值、解构赋值、rest参数(扩展用算符...)
	if(n===1) return total;
	return test2(n-1,n*total);
}
test2(5,1)
//蹦床函数
function test3(f){
	aif(f && f instanceof Function){
		f = f()
	}
	return f
}
function sum(x,y){
	if(y > 0){
		return sum.bind(null,x+1,y-1);
	}else{
		return x;
	}
}
test3(sum(1,10))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值