JavaScript闭包疑问:为何未输出undefined?
为什么执行
sayHi("Hello")不会输出Helloundefined? 我正在尝试理解JavaScript里的闭包机制,遇到了一个困惑的点:
当我执行sayHi("Hello")("John Doe")时,控制台能正常输出HelloJohn Doe,这符合预期;但如果只执行sayHi("Hello"),控制台却是空白的,而不是我以为的Helloundefined。相关代码如下:
function sayHi(whattosay){ return function yolo(name) { console.log(whattosay + name) } } sayHi("Hello")
这事儿其实和闭包本身关系不大,核心是你有没有调用那个返回的函数!
咱们拆解一下代码执行过程:
- 当你调用
sayHi("Hello")的时候,这个函数会立刻返回内部定义的yolo函数——注意,只是返回这个函数本身,并没有执行它! - 只有当你在后面加
("John Doe")时,才是把返回的yolo函数给调用了,这时候name参数会被赋值为"John Doe",然后执行console.log输出拼接后的字符串。
那为什么只执行sayHi("Hello")不会输出Helloundefined呢?因为console.log根本没被执行啊!你只是拿到了那个yolo函数,但没让它跑起来。如果想看到Helloundefined,你得主动调用返回的函数,比如写成:
sayHi("Hello")() // 这里不传参数,name就是undefined,会输出Helloundefined
简单总结一下:sayHi是一个返回函数的函数,第一次调用它只是拿到了内部函数的引用,只有再调用这个返回的函数,才会触发console.log的执行。
内容的提问来源于stack exchange,提问作者WanderingDoge
相关产品推荐
相关产品推荐

