【问题标题】:Why assign a declared function to a variable in javascript?为什么将声明的函数分配给javascript中的变量?
【发布时间】:2017-06-21 16:42:05
【问题描述】:

我正在尝试了解闭包,并从 MDN 发现了这段代码。我在 jsbin 中尝试过,它可以工作,但我不明白为什么必须将 makeFunc 分配给 var myFunc 然后调用 myFunc 而不是只调用 makeFunc,这不起作用。

function makeFunc() {
    var name = "Mozilla";
    function displayName() {
        alert(name);
    }
    return displayName;
}
var myFunc = makeFunc();
myFunc();

【问题讨论】:

  • makeFunc()(); 有效。或者,如果您将 return 更改为 return displayName();,则 makeFunc(); 将起作用。
  • “而不仅仅是调用 makeFunc” 但你是在var myFunc = makeFunc(); 中调用它。不确定我是否理解您的困惑。
  • @FelixKling 他们似乎不明白为什么简单地调用makeFunc() 不会触发警报。或者至少这是我的猜测。
  • “不起作用”当然不是一个有用的问题描述,因为您对它“应该如何工作”的期望可能与我们的完全不同。但是,如果您不解释您的观点,我们将无法真正帮助您。
  • 是的。你可以离开 myFunc。只需执行 makeFunc()();

标签: javascript function variables closures


【解决方案1】:

我不明白为什么必须将 makeFunc 分配给 var myFunc

这不是正在发生的事情。看代码:

var myFunc = makeFunc();
                     ^^

makeFunc 正在被调用。分配给myFunc的是它的返回值

那个返回值是displayName(它可以访问封闭的name变量)。

myFunc(); 然后调用 that 函数。

【讨论】:

    【解决方案2】:

    makeFunc 正在返回一个名为 displayName 的函数,其中包括变量 name 中的“Mozilla”值,该变量只能在 displayName 函数中访问(尽管它不“知道”它是最初称为“displayName”...它现在只是包含该函数的主体以及name 的值)。当你将调用makeFunc的结果赋值给myFunc时,myFunc包含函数displayName,包括name的值。但是请注意,displayName 在那个时间点尚未被调用/调用。现在,当您调用 myFunc 时,displayName 会运行,创建一个显示名称“Mozilla”的警报。

    【讨论】:

      【解决方案3】:

      我会尽量给出一个非常简短的答案:

      makeFunc()只返回函数而不执行它,因为返回值是函数名。

      var myFunc = makeFunc();
      myFunc();
      

      从上面的代码中,您将我之前提到的函数分配给myFunc。在下一行添加(),表示执行该函数。因此,为什么您会看到 alert(); 结果。


      插图

      makeFunc() == displayName
      myFunc == makeFunc()
      myFunc == displayName
      myFunc() == displayName()
      

      【讨论】:

        【解决方案4】:

        页面加载关闭允许函数自动运行

        为您的代码 - 您可以按照您的预期重新调整您的代码,而无需将其分配给变量 myFunc

        (function makeFunc() {
            var name = "Mozilla";
            function displayName() {
                alert(name);
            }
            return displayName;
        })();
        

        【讨论】:

          猜你喜欢
          • 2019-03-27
          • 1970-01-01
          • 2012-09-03
          • 2020-05-09
          • 2019-11-14
          • 2022-11-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多