为何使用匿名函数将函数存储为变量?两段代码运行差异解析
关于匿名函数存储与闭包的问题解答
一、为什么要用匿名函数将函数存储为变量?
其实这么做主要是为了适配几个常见的编程场景:
- 实现闭包,保留外部作用域的变量:就像你例子里的
remember函数,通过返回匿名函数,能把外部的number变量“记住”,后续调用返回的函数时还能访问到它,这是很多状态保存场景的常用技巧。 - 作为回调函数传递:比如在异步操作(定时器、网络请求)里,你经常需要把一个函数作为参数传进去,用匿名函数直接赋值给变量或者直接传递,写法更简洁灵活。
- 动态生成函数逻辑:有时候你需要根据不同条件创建不同行为的函数,把匿名函数赋值给变量能方便地实现这种动态性。
- 简化代码结构:对于一些短小的、只需要用一次的函数,直接用匿名函数存成变量,不用特意给它起个名字,让代码更紧凑。
二、两段代码的差异解析
咱们逐段拆解来看:
第一段能正常运行的代码
function remember(number) { return function() { return number; } } const returnedFunction = remember(5); console.log( returnedFunction() ); // 5
当你调用remember(5)的时候,这个函数返回的是一个新的匿名函数,而不是直接返回number。所以returnedFunction实际上存储的是这个匿名函数的引用。当你执行returnedFunction()时,就会调用这个匿名函数,它会返回之前闭包保留的number(也就是5),自然能正常输出。
这里核心是闭包的作用:内部的匿名函数可以访问外部函数remember的变量number,哪怕remember已经执行完毕,这个变量依然被保留着。
第二段报错的代码
function remember(number) { return number; } const returnedFunction = remember(5); console.log( returnedFunction() );
这段里的remember(5)直接返回的是number的值,也就是数字5。所以returnedFunction存储的是一个数值类型的数据,而不是函数。当你尝试用()去调用一个数字时,JS引擎就会报错,提示你returnedFunction is not a function——毕竟数字不是函数,没法被调用呀。
内容的提问来源于stack exchange,提问作者Faisal
相关产品推荐
相关产品推荐

