匿名函数是表达式吗?为何在JS期望表达式处未按预期工作?
匿名函数是函数表达式吗?为什么示例中未按预期工作?
核心结论
- 匿名函数确实属于函数表达式的范畴,但你遇到的问题和它是不是表达式无关,而是因为你没有调用这个函数,只是把函数对象本身传给了
String()。
你的代码分析
你写的代码:
const result = String(function () { return 2; });
这里的function () { return 2; }是一个匿名函数表达式,它本身是一个函数对象,而非这个函数的返回值。当你把它传给String()时,JS会默认调用函数对象的toString()方法,将函数的源码转换成字符串,所以你得到了函数体的字符串形式。
如何得到预期结果
要获取函数返回的2并转成字符串,你需要调用这个匿名函数,把它的返回值传给String()。有两种常见写法:
- 直接在函数表达式后加调用括号:
const result = String(function () { return 2; }());
- 用括号包裹函数表达式(更符合立即执行函数表达式的规范写法):
const result = String((function () { return 2; })());
这两种写法都会先执行匿名函数得到返回值2,再把2传给String(),最终得到'2'。
补充说明
函数表达式的本质是一个表达式,它的求值结果是函数对象。如果想得到函数的返回值,必须主动调用它——不管是匿名函数还是具名函数表达式,都是这个逻辑。你之前的误解在于把“函数表达式本身”和“函数执行后的返回值”混淆了。
内容的提问来源于stack exchange,提问作者radman
相关产品推荐
相关产品推荐

