function a(){
function b(){
alert("hi");
}
return b();
}
function c(){
var d = a();
}
c();
当我执行上述操作时,我收到警告“hi”。 但如果我这样做
function a(){
function b(){
alert("hi");
}
return b();
}
function c(){
var d = a();
d();
}
c();
我希望在c();中看到两个分配和函数调用语句的警报,但我只得到一个警报。我究竟做错了什么?
答案 0 :(得分:6)
因为方法a
没有返回任何内容,因为a
在return语句中调用b
但b
没有返回任何内容,因此d
未定义whcih会导致d()
抛出错误
演示:Fiddle
function c() {
var d = a();
alert(d)
d();
}
如果您看到小提琴,则第二个警报显示未定义为d
的值答案 1 :(得分:4)
您正在调用未定义的函数。
function a(){
function b(){
alert("hi");
// no return => return undefined
}
// the result of b() === undefined
return b();
}
function c(){
// assign the result of a to variable d
// (which is itself the result of b, which is undefined, because b has no return)
var d = a();
// call undefined function, this will throw an error
d();
}
c();
答案 2 :(得分:3)
混淆源于调用/调用函数和引用该函数之间的区别。将()
添加到函数引用时,您正在调用该函数,该函数返回执行该函数的结果(而不是函数本身)。
所以在这一行:
function c(){
var d = a();
d();
}
您正在为函数调用的结果而不是函数引用分配d
。由于返回的值本身不是函数,因此对d()
的调用将失败。
同样适用于你所拥有的顶级功能(这似乎更容易出错):
return b();
当前代码将执行该函数并返回结果,如果所需行为是返回对函数本身的引用,则它不应该具有()
。
答案 3 :(得分:2)
你需要返回函数引用,而不是调用它:
return b;
答案 4 :(得分:1)
在第二个代码中,您基本上会返回警报的结果,该结果应为undefined
。
var d <= a() <= c() <= b() <= alert('hi') // alert returns undefined
调用d
会抛出错误。
答案 5 :(得分:0)
如果在第二个示例中执行c(),将发生以下情况:
使用某些工具(如chrome的js控制台)来运行和调试js。