【问题标题】:Incrementing a local variable using JavaScript使用 JavaScript 增加局部变量
【发布时间】:2011-08-26 14:12:03
【问题描述】:

我正在尝试增加一个计数器,但我想将变量移出全局命名空间并在本地声明它。我不知道该怎么做。感谢您的帮助。

这是我目前正在使用的代码。

var mediaClickCounter = 0;
function refreshMediaAds() {
    if (mediaClickCounter < 2) {
        mediaClickCounter++;
    } else {
        mediaClickCounter = 0;
        refreshAds();
    }
}

【问题讨论】:

    标签: javascript variables local counter increment


    【解决方案1】:
    // the function creates a local scope. 
    var refreshMediaAds = (function() { 
        var mediaClickCounter = 0;
        // once executed it returns your actual function.
        return function _refreshMediaAds() {
            if (mediaClickCounter < 2) {
                mediaClickCounter++;
            } else {
                mediaClickCounter = 0;
                refreshAds();
            }
        }
    // you execute the function.
    })();
    

    闭包

    【讨论】:

    • 呸,你比我先到了那里。在我打字时发布了相同的答案... +1
    • 嗨。这次真是万分感谢。干得好!!你能解释一下吗?我不明白怎么会有两个 refreshMediaAds 功能。在调试第一次调用 var refreshMedia... 时似乎被忽略了。只是想确保我理解!再次感谢。
    • 内部嵌套函数不应该有名字,应该是匿名的。
    • @Endophage 如果需要,它可以有一个名字。如果您使用的 IE 的损坏版本因命名函数表达式而崩溃,那么 RRRRRRAAAAAAGGGGGGGEEEEEEEE。我的名字是独一无二的;)
    • meh... 我还是会说它“不应该”(不能)有名字。在应该只是匿名的东西上浪费一个名字是没有意义的......
    【解决方案2】:

    如何使用这样的东西:

    var ClickCounter = {
     mediaClickCounter: 0,
    
     refreshMediaAds:function() {
        if (this.mediaClickCounter < 2) {
            this.mediaClickCounter++;
        } else {
            this.mediaClickCounter = 0;
            refreshAds();
        }
     }
    };
    

    然后你可以使用ClickCounter.refreshMediaAds() 来增加成员变量。

    【讨论】:

    • 这是一个很好的解决方案。也使用例如。 MooTools 你可以拥有 OOP 的附加功能。
    【解决方案3】:

    有可能,您可以创建一些对象并将函数用作其方法。这样变量将是对象的属性,而不是全局变量。

    如果您目前不使用任何框架,使用 MooTools 可能会对您有很大帮助。创建和使用对象的一些示例位于此处:http://mootools.net/docs/core/Class/Class

    【讨论】:

      【解决方案4】:

      你可以尝试归还你所拥有的(这样你以后可以根据需要使用它)

      function refreshMediaAds(mediaClickCounter) {
          if (mediaClickCounter < 2) {
              mediaClickCounter++;
          } else {
              mediaClickCounter = 0;
              refreshAds();
          }
          return mediaClickCounter;
      }
      //then do: 
      refreshMediaAds(clicks)
      

      【讨论】:

        【解决方案5】:
        function refreshMediaAds() {
        var mediaClickCounter = 0; // now variable have local scope.
            if (mediaClickCounter < 2) {
                mediaClickCounter++;
            } else {
                mediaClickCounter = 0;
                refreshAds();
            }
        }
        

        【讨论】:

        • 我不确定这是否正确。每次调用 refreshMediaAds 时,mediaClickCounter 都会重置为 0,因此永远不会调用 refreshAds()
        • 在这种情况下,每次调用该函数时,mediaClickCounter 都会重置为 0。对吗?
        • 刚看到你的评论。对不起。
        【解决方案6】:

        如果你真的必须这样做,我相信这样的事情会奏效。但是,IMO 你应该把它留在全局命名空间中。

        var refreshMediaAds = function() {
            var mediaClickCounter = 0;
            return function()
            {
                if (mediaClickCounter < 2) {
                    mediaClickCounter++;
                } else {
                    mediaClickCounter = 0;
                    refreshAds();
                }
            }
        
        }();
        

        注意,我没有对此进行测试,这是对解决方案的有根据的猜测。

        【讨论】:

        • 我认为应该避免使用全局变量。没有?
        • @user699242 也许如果你正在编写一个可以在其他人的网站上运行的脚本,比如 jQuery。如果它是您自己的脚本在您自己的网站上运行,那么这不是什么大问题,如果您后来创建了冲突,您只会搞砸自己。
        猜你喜欢
        • 2013-10-01
        • 2015-03-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多