了解不同的嵌套函数调用

时间:2018-07-04 05:25:50

标签: javascript

我知道有很多与调用嵌套函数有关的好答案,但是我的问题恰好不同。

假设我们有这样的代码

function a() {
  var c = 0;
  function b() {
    alert(c++);
  }
  return b;
}
var d = a();
d();

在这里,我们做了return b,然后

 var d = a();
    d();

调用它,即它仅在我们执行d();时运行,但代码几乎相同

function a() {
  var c = 0;
  function b() {
    alert(c++);
  }
  return b();
}

var d = a();

return b();做的地方,我们可以直接通过var d = a();调用它,而不必调用d();,为什么会这样呢?我知道return b和return b()的区别正在起作用,但是仍然有人可以解释为什么,我们可以直接通过var d = a();调用它,而不必调用`d();吗?

3 个答案:

答案 0 :(得分:1)

如果我正确理解了您的问题,那是在通过在var d = a();上加上括号而实际上是在调用函数a。运行代码时

function a() {
  var c = 0;
  function b() {
    alert(c++);
  }
  return b();
}

var d = a();
d();

它给出了一个错误,并且发生的是d不是一个函数,当您将a()分配给var d时,您正在分配a()的结果 ,它在function a中将返回a的结果,因为return b()实际上正在调用function b,该结果返回function b结果,因此反过来,运行代码时var d实际上等于0。如果您想将实际功能a分配给变量d,只需删除这样的括号

function a() {
  var c = 0;
  function b() {
    alert(c++);
  }
  return b;
}

var d = a; <-------
d();

它很好用。

答案 1 :(得分:0)

  

我们可以直接通过var d = a()来调用它;并且不需要调用`d();?

您不只是“不需要呼叫”-您不能呼叫“ d();”

(如果函数b的返回值不是函数)

但是为什么?

因为您已将函数a的返回值分配给变量d。 返回值“ a”(不幸的是)是函数“ b”的返回值。

现在,如果函数“ b”的返回值不是函数(我想不是),那么您将把“ d”分配给对象或int或除函数外的其他所有东西,其中“ d( );“将是无效的操作。

答案 2 :(得分:0)

返回“ b”时,返回函数引用。

返回“ b()”时,将调用该函数并返回结果。

You can easy map this to the ajax:
function onSuccess() {
...
}
$.ajax(url, onSuccess);

您将引用传递给该函数,该函数将在ajax完成后被调用。

但这是

$.ajax(url, onSuccess());

您立即调用onSuccess并将结果传递给函数。