JavaScript 理解示例中的闭包

closures in javascript understanding example

本文关键字:闭包 JavaScript      更新时间:2023-09-26
function setupSomeGlobals() {
    // Local variable that ends up within closure
    var num = 666;
    // Store some references to functions as global variables
    gAlertNumber = function() {console.log(1); alert(num); }
    gIncreaseNumber = function() { num++; }
    gSetNumber = function(x) { num = x; }
}

我怎样才能访问这里的gAlertNumber方法?

更新:此代码是关于 JavaScript 闭包如何工作的答案中的示例 4

假设你在Web浏览器中,你必须先执行setupSomeGlobal()。然后你的非声明处理程序变量g...将在全局对象window下创建,您将能够从页面中的任何位置执行gAlertNumber()

您可以在身体的onload中执行setupSomeGlobal()

<html>
    <head>
        <script>
            function setupSomeGlobals() {
                // Local variable that ends up within closure
                var num = 666;
                // Store some references to functions as global variables
                gAlertNumber = function() {console.log(1); alert(num); }
                gIncreaseNumber = function() { num++; }
                gSetNumber = function(x) { num = x; }
            }
        </script>
    </head>
    <body onload="setupSomeGlobals();">
        <input type="button" value="Show me more or less the number of the beast" onclick="gAlertNumber();"
    </body>
</html>

也就是说,您设置"全局"函数的方法不是很漂亮。例如,我非常喜欢这里描述的模式。

下面是一个例子,

(function() {
   console.log(1);
   // Local variable that ends up within closure
   var num = 666;
   var sayAlert = function() { console.log(num); }
   num++;
   return sayAlert();
})();

这将在定义后立即调用。

所以使用你的代码,

function setupSomeGlobals() {
  var num = 666;
  // Store some references to functions as global variables
  gAlertNumber = function() {console.log(1); alert(num); }
  gIncreaseNumber = function() { num++; }
  gSetNumber = function(x) { num = x; }
  gAlertNumber();
}
setupSomeGlobals();

在这里,您可以在父函数setupSomeGlobals()内部调用子函数gAlertNumber(),而不能在父函数外部访问它。

但是你可以在调用父函数

后调用它,这意味着不要调用父函数中的gAlertNumber()。 调用父函数后调用它,

function setupSomeGlobals() {
    // Local variable that ends up within closure
    var num = 666;
    // Store some references to functions as global variables
    gAlertNumber = function() {console.log(1); alert(num); }
    gIncreaseNumber = function() { num++; }
    gSetNumber = function(x) { num = x; }
}
setupSomeGlobals();
gAlertNumber();

从 setSomeGlobals(( 返回一个包含这三个方法的对象。通过此对象,您将能够访问感兴趣的函数并操作 num 并保持其状态,但您将无法直接访问 num。这被称为模块模式,一种闭包应用。

好吧,

这将在浏览器中工作

gAlertNumber 被视为窗口属性。这与调用相同

  window.gAlertNumber()

所以在你的 setSomeGlobals 中,你将函数对象分配给未定义的窗口属性。然后关闭该对象内的局部变量 num,该变量已在窗口对象内创建。因此,您可以从窗口范围访问它。