无论您是否返回`console.log`,为什么都得到完全相同的结果?

问题描述

为什么打电话 console.log()

function test1() {
  console.log('test1')
}

// or ES6
const test2 = () => { console.log('test2') }

给出与返回 console.log()

相同的结果
function test3() {
  return console.log('test3')
}

// or ES6
const test4 = () => console.log('test4')

test1() // -> test1 undefined
test2() // -> test2 undefined
test3() // -> test3 undefined
test4() // -> test4 undefined

虽然我了解没有显式函数return始终会返回undefined,但对我来说,返回console.log()的结果会给与我直觉完全相同的输出

解决方法

我认为通过查看以下内容,您会更好地理解

const realConsoleLog = console.log
console.log = (...val) => {
  realConsoleLog(...val)
  return val
}
const noReturn = () => { console.log('yep') }
const doesReturn = () => console.log('yep')
const a = noReturn()
const b = doesReturn()
console.log(`a is ${a}`)
console.log(`b is ${b}`)

如果运行程序,您会发现将noReturn()doesReturn()函数分配给变量时会执行它们。因此,在第一种情况下,该函数正在执行其块,然后return不执行任何操作,因此a为undefined。但是在doesReturn函数中,您实际上是在执行console.log方法,我们已经对其进行了调整,以返回所有原始参数,然后返回console.log返回的变量。由于原始的console.log不返回任何内容,因此您将获得undefined作为答案。

,

JavaScript没有void返回类型说明,因此,如果没有这样的显式return,则只要任何执行上下文停止,undefined都将返回。

要说明理由-JavaScript中的void是一个运算符,用于评估其旁边的表达式。无论评估哪个表达式,void总是返回undefined

您可以了解到,无论何时在浏览器中使用console,即使您为变量分配了值,也会看到undefined的返回值是main线程执行上下文返回

找到了这个答案,该答案具有很好的关联性-Why do functions return `undefined` instead of `null` by default?