将函数作为高阶函数参数传入时报错,反转参数顺序正常的原因
为什么反转transformer函数的参数顺序后,代码不再报错?
你遇到的Uncaught TypeError: firstUpper is not a function错误,本质是参数传递和函数定义不匹配导致的:
原代码里
transformer的参数定义是(string, firstUpper),但你调用它时只传了firstUpperCaseWord这一个参数。这会让string接收到firstUpperCaseWord函数,而firstUpper因为没传值变成undefined。当执行firstUpper(string)时,相当于试图调用undefined(它不是函数),自然抛出类型错误。反转
transformer的参数顺序后,参数定义变成(firstUpper, string),此时如果你调用时传入firstUpperCaseWord和需要处理的字符串(比如transformer(firstUpperCaseWord, "hello world")),firstUpper会拿到firstUpperCaseWord函数,string拿到目标字符串,执行firstUpper(string)就变成了正常调用firstUpperCaseWord("hello world"),代码自然能正常运行。
你觉得参数顺序不该有影响,是忽略了JavaScript函数的参数匹配规则:函数是按位置顺序接收参数的,第一个实参对应第一个形参,第二个对应第二个,没传值的形参会默认是undefined。
错误代码逻辑演示
function transformer(string, firstUpper){ // 调用时只传了firstUpperCaseWord,所以string = firstUpperCaseWord,firstUpper = undefined console.log(firstUpper(string)); // undefined不是函数,触发报错 } transformer(firstUpperCaseWord);
修正后代码逻辑演示
function transformer(firstUpper, string){ // firstUpper = firstUpperCaseWord,string = "hello world" console.log(firstUpper(string)); // 正常调用函数,输出处理后的字符串 } transformer(firstUpperCaseWord, "hello world");
内容的提问来源于stack exchange,提问作者sanchit gupta
相关产品推荐
相关产品推荐

