为何将匿名函数作为参数传入时会被当作字符串处理?
问题原因
你遇到的核心问题是:你传递的是函数本身,而没有执行它来获取返回值。
在JavaScript中,当你把函数直接作为参数传入另一个函数时,如果没有主动调用它(加()),目标函数的参数接收的是整个函数对象。当你执行str += letter时,JavaScript会自动把函数对象转换为它的字符串表示形式(也就是你看到的那段函数代码),再和"a"拼接,所以才得到了那个奇怪的结果。
修正方案
有两种解决方式,第二种更贴合你练习“函数作为参数传递”的初衷:
方式1:传递参数时立即执行函数
直接在传入的函数后面加(),让它执行并返回"pizz":
function appendLetterToString(letter, str) { return str += letter } let pizza = appendLetterToString("a", (function(){ return "pizz"; })()) console.log(pizza); // 输出 'pizza'
方式2:在目标函数内部调用传入的函数
这种方式才是真正将函数作为参数使用(和你参考的map示例逻辑一致),在appendLetterToString内部调用传入的函数,获取它的返回值再进行拼接:
function appendLetterToString(letter, getStringFunc) { // 调用传入的函数,拿到它返回的字符串 const originalStr = getStringFunc(); return originalStr += letter; } let pizza = appendLetterToString("a", function(){ return "pizz"; }) console.log(pizza); // 输出 'pizza'
和你参考的
map示例对比 你参考的map示例中,map方法内部会自动遍历数组,并且主动调用你传入的回调函数,把数组的每个元素作为参数传给它,所以你不需要手动调用那个函数。而你自己写的appendLetterToString没有这个逻辑,所以需要你自己处理函数的调用。
内容的提问来源于stack exchange,提问作者codenoob
相关产品推荐
相关产品推荐

