对在javascript中返回函数的函数感到困惑

时间:2013-12-31 15:28:01

标签: javascript

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();中看到两个分配和函数调用语句的警报,但我只得到一个警报。我究竟做错了什么?

6 个答案:

答案 0 :(得分:6)

因为方法a没有返回任何内容,因为a在return语句中调用bb没有返回任何内容,因此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(),将发生以下情况:

  • 执行功能a
  • in a:execution function b
  • 在b中:执行警报(不返回,因此返回未定义)
  • in a:从b
  • 返回未定义的值
  • var d现在包含未定义的
  • 执行d应抛出异常:TypeError:undefined不是函数

使用某些工具(如chrome的js控制台)来运行和调试js。