在没有括号的情况下在JS中调用和分配函数

时间:2016-02-15 19:26:59

标签: javascript function invocation

function makeFunc() {
  var name = "Mozilla";

  function displayName() {
    alert(name);
  }
  return displayName;
}

var myFunc = makeFunc();
myFunc();

即使displayName没有括号,上面的代码仍然有效,即传递对displayName的引用,然后makeFunc()将调用该引用。

现在,如果你做return displayName(); var myFunc = makeFunc;它也可以按预期工作。但如果你做return displayName; var myFunc = makeFunc;它就会停止工作。

它应该有效,因为myFunc()会调用这两个函数吗?

1 个答案:

答案 0 :(得分:3)

函数引用只是JavaScript中的一个值。函数调用是一个涉及两件事的表达式:对函数的引用和带括号的参数列表。

没有参数列表,对函数的引用只是一个值。

因此,在您的代码中:

function makeFunc() {
  var name = "Mozilla";

  function displayName() {
    alert(name);
  }
  return displayName;
}

标识符" displayName"在函数中指的是内部函数。 return语句引用标识符而不是带括号的参数列表。因此,makeFunc()的返回值是对该内部函数的引用。将其分配给另一个变量会使该变量具有相同的值,因此稍后可以在函数调用表达式中使用它。

请注意,您可以调用makeFunc()并立即调用返回的函数:

makeFunc()();

这是两个函数调用表达式的序列。第一个是makeFunc()。返回一个函数引用,因为第二个()会调用该函数。