function a() {
console.log('A!');
function b(){
console.log('B!');
}
return b;
}
当我这样做时,
var s = a();
这是输出:
A!
当我这样做时,
a();
输出如下:
A!
ƒ b(){
console.log('B!');
}
我想知道为什么那里的输出不同。
因为函数a
返回一个函数b
。
因此,这样做console.log(a())
将打印函数b
的源代码。
如果要执行返回的函数,只需调用它:
function a() {
console.log('A!');
function b() {
console.log('B!');
}
return b;
}
var s = a()
console.log(s);
console.log("--------------------------------------")
s();
发生这种情况是因为您返回的是b
本身而不是b
的结果(b()
)。
而且,由于您已在控制台中运行该函数,因此a
的结果(即函数b
)将以"代码形式"显示。
我花了一段时间才理解你的问题,但就我的辩护而言,似乎有多个问题合二为一,充满了相互矛盾的陈述、遗漏和错别字("by()"而不是"b()" ?简而言之,我们可以感受到您心中的困惑:-)
例如,您谈论参数,但您的函数都没有接受参数。此外,您似乎认为您会在某个时候调用b
,但代码中没有类似b();
的内容。最后,您从不告诉我们,但您直接在浏览器的控制台中编码,对吗 ?
话虽如此,以下是我总结主要问题 的方式:
为什么
var s = a();
和a();
有不同的输出 ?
你说var s = a();
打印A!
,而a();
打印A!
加功能b
。实际上,a();
不打印功能b
,这个额外的输出来自浏览器的控制台。请记住,有两种类型的输出,一种是您使用console.log(...)
明确要求的输出,另一种是由控制台本身生成的输出。正如 epascarello 所说,"在控制台中 [...]输出最后一条语句"。如果将a();
写入控制台并按 ENTER,则最后一个语句是a()
,并且由于a
返回b
,控制台输出函数b
。如果您编写var s = a();
,a
仍然返回b
但控制台不会告诉您a()
因为不再是最后一条语句。我不确定,但在这种情况下,我会说var
是最后一条语句,由于var
不返回任何内容,因此控制台不输出任何内容。