JS中不带括号的函数调用和赋值

Calling and assigning functions in JS without parenthesis

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() 会调用这两个函数?

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

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

因此,在您的代码中:

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

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

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

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

makeFunc()();

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