
本文详解高阶函数中参数顺序与数量的常见误区,重点说明为何遗漏字符串参数会导致“firstupper is not a function”错误,并提供可运行示例与调试建议。
在 JavaScript 中,高阶函数是指接受函数作为参数、或返回函数的函数。你定义的 transformer 正是一个典型的高阶函数——它接收一个字符串和一个转换函数(如 firstUpperCaseWord),并在内部调用该函数处理字符串。
但问题代码中这一行存在关键错误:
transformer(firstUpperCaseWord);
这里只传入了一个参数(即函数本身),而 transformer 的函数签名明确要求两个参数:transformer(string, firstUpper)。因此,当执行 firstUpper(string) 时,实际等价于:
undefined('foo bar biz'); // 因为 string === undefined,firstUpper === firstUpperCaseWord(正确),但等等——不对!⚠️ 等等——再仔细看:参数顺序是 (string, firstUpper),而你只传了一个参数 firstUpperCaseWord,那么 JS 会将其赋值给第一个形参 string,而 firstUpper 则默认为 undefined。所以真正执行的是:
console.log(undefined('foo bar biz')); // TypeError: firstUpper is not a function这就是报错的根本原因:firstUpper 是 undefined,而非函数。
✅ 正确调用方式必须严格匹配形参顺序与数量:
function firstUpperCaseWord(st) {
let st1 = st.split(" ");
st1[0] = st1[0].toUpperCase();
return st1.join(" ");
}
function transformer(string, firstUpper) {
console.log(firstUpper(string)); // ✅ 此时 firstUpper 是函数,string 是字符串
}
// ✅ 正确:两个参数,顺序为 (string, transformerFn)
transformer("hello world", firstUpperCaseWord); // 输出: "HELLO world"
// ❌ 错误:仅一个参数 → string = firstUpperCaseWord, firstUpper = undefined
// transformer(firstUpperCaseWord);? 小技巧:可通过解构或默认参数增强健壮性(进阶实践):
function transformer(string, transformFn) {
if (typeof transformFn !== 'function') {
throw new TypeError('Second argument must be a function');
}
if (typeof string !== 'string') {
throw new TypeError('First argument must be a string');
}
return transformFn(string);
}? 总结:
- 高阶函数的参数顺序和数量必须严格匹配调用时的实参;
- JavaScript 不会自动推断“哪个参数是函数”,一切依赖你传入的位置;
- 报错 xxx is not a function 往往意味着该变量实际为 undefined 或其他非函数类型——请优先检查是否漏传、错序或命名混淆;
- 开发中建议添加类型校验,及早暴露逻辑错误。










