JavaScript高阶函数与闭包:greet两种调用方式的差异疑问
关于高阶函数greet的调用区别解析
先明确greet函数的本质:这是一个高阶函数,它接受一个greeting参数,返回另一个专门处理名字的内部函数。内部函数的作用是打印greeting + name,而且没有任何返回值(所以调用后默认返回undefined)。
逐个拆解不同调用的行为:
greet('Hello')('Jonas')- 先执行
greet('Hello'):传入greeting为'Hello',返回一个内部函数(我们暂时叫它sayHello),结构是:function(name) { console.log(`Hello ${name}`); } - 紧接着用
('Jonas')调用sayHello,name参数被赋值为'Jonas',所以控制台输出Hello Jonas。
- 先执行
你误解的
greet('Hello')输出Hello undefined
单独执行greet('Hello')只会返回那个内部函数sayHello,根本不会触发console.log——控制台只会显示这个函数的源码,不会输出Hello undefined。你看到的这个输出,其实是调用greet('Hello')()时的第一步结果。greet('Hello')()- 同样先执行
greet('Hello')得到内部函数sayHello; - 调用
sayHello()时没有传任何参数,所以name的默认值是undefined,执行console.log后输出Hello undefined; - 因为
sayHello没有return语句,这个调用的返回值是undefined——如果你是在控制台直接输入这个表达式,控制台会在输出Hello undefined之后,额外显示这个返回值,也就是你看到的第三行undefined。
- 同样先执行
解答你的核心困惑:
greet('Hello')确实等价于内部的function(name),但它只是获取到这个函数,并没有调用它。只有在后面加(),才会触发这个内部函数的执行。greet('Hello')()的输出分两部分:Hello undefined是内部函数console.log的结果,而单独的undefined是内部函数调用后的返回值——这就是它和你误以为的greet('Hello')输出不同的原因。
内容的提问来源于stack exchange,提问作者DKXP
相关产品推荐
相关产品推荐

