-1
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 ?

4

4 回答 4

1

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

您可以setupSomeGlobal()在正文中执行onload

<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>

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

于 2013-10-11T13:18:23.220 回答
0

这是一个例子,

(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();

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

但是你可以在调用父函数之后调用它,这意味着不要调用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();
于 2013-10-11T12:58:12.130 回答
0

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

于 2013-10-11T13:20:14.757 回答
0

那么这将在浏览器中工作

gAlertNumber 被认为是窗口属性。它与调用相同

  window.gAlertNumber()

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

于 2013-10-11T13:21:14.793 回答