代码之家  ›  专栏  ›  技术社区  ›  WSBT

在JavaScript中持久化变量而不是全局变量

  •  4
  • WSBT  · 技术社区  · 12 年前

    我想要一个按钮,同时作为一些重复出现的定时事件的“启动”和“停止”按钮。

    要做到这一点,我可以在所有内容的顶部设置一个全局变量:

    toggleOn = false; 
    

    然后,在 <button onClick="... ,我可以:

    toggleOn =! toggleOn;
    foo(); 
    function foo() {
      // do my stuff
      if (toggleOn) {
        setTimeout(foo, 5000);
      }
    }
    

    但问题是,我不能使用全局变量来完成同样的任务。我该怎么做?是否有一个持久变量可以携带其范围之外的值?

    3 回复  |  直到 12 年前
        1
  •  4
  •   Community Mohan Dere    9 年前

    这是一个例子,其中闭包是该语言的一个重要功能。

    (function()
    {
        var active = false;
        myButton.addEventListener('click', function myButtonClick(event)
        {
            if (active) {
                // recursion..?
                setTimeout(myButtonClick, 5000);
            }
    
            active = !active;
        }
    })();
    

    更多关于闭包的信息 here .

        2
  •  2
  •   jods    12 年前

    使用javascript模块模式。类似这样的内容:

    var handler = function () {
      var private_state = true;
      return function() {
        private_state = !private_state;
        if (private_state) {
          // Do something
        }
      }
    }();
    

    使用 handler 作为你的按钮 onclick 处理程序。

        3
  •  0
  •   callmehiphop    12 年前

    前面的回答已经指出,您可以使用闭包来存储一个“私有”变量,该变量可以跟踪状态。或者,您也可以使用HTML5数据来存储这些数据。

    html格式

    <button data-toggleOn="false">Click me!</button>
    

    javascript语言

    button.addEventListener('click', function() {
      var toggleOn = this.dataset.toggleOn = !JSON.parse(this.dataset.toggleOn);
    
      if (toggleOn) {
        // do stuff!
      }
    });
    

    如果您使用的是jQuery。。

    $('button').click(function() {
      var toggleOn = !$(this).data('toggleOn');
      $(this).data('toggleOn', toggleOn);
    });