为何JavaScript中调用函数a()并赋值与直接调用的输出不同?
为什么两种调用函数
a()的方式输出存在差异? 先把问题里的代码和现象明确一下:
函数定义
function a() { console.log('A!'); function b(){ console.log('B!'); } return b; }
两种调用场景的输出
- 执行
var s = a();→ 控制台仅输出:A! - 直接执行
a();→ 控制台输出:A!以及ƒ b(){ console.log('B!'); }
核心原因:控制台会自动打印表达式的返回值
这个差异其实和函数a本身的逻辑无关,而是浏览器控制台的默认行为导致的:
当执行
var s = a();时:
这是一个赋值语句,JavaScript引擎的工作是执行函数a(所以触发内部的console.log('A!')),然后把a的返回值(也就是函数b)赋值给变量s。此时控制台不会主动打印这个返回值——因为你只是把值存起来,没有要求它输出。当直接执行
a();时:
这是一个独立的表达式,控制台在执行完函数a(打印A!)之后,会自动把这个表达式的计算结果(也就是被a返回的函数b)输出到控制台,所以你会看到额外的函数b的源码。
额外补充
顺便提一句:函数b只是被a返回了,不管哪种调用方式,b本身都没有被执行——只有当你调用s()或者a()()的时候,才会看到控制台打印B!哦。
内容的提问来源于stack exchange,提问作者Xinyi Li
相关产品推荐
相关产品推荐

