我可以根据对另一个变量的更改来设置变量的值吗?

时间:2014-05-16 03:27:59

标签: javascript lodash

我有一个javascript变量a和一个变量b,其值为0或1.

有人可以建议我如何对函数进行编码,以便b可以依赖a这样的值:

  • a从0更改为1时 - 如果a为1,超过 500毫秒,则b设置为1
  • a从1更改为0时,b立即设为0

如果有办法使用函数对此进行编码,那么是否可以将其附加到变量a's setter?

2 个答案:

答案 0 :(得分:2)

如果可以,请使用defineProperty包裹访问权限:

var obj = {
    _a: 1
};

Object.defineProperty(obj, "a", {
    get: function() {
        return this._a;
    },

    set: function(newA) {
        if (this.changeB) {
            clearTimeout(this.changeB);
            this.changeB = null;
        }

        if (this.a == 0 && newA == 1) {
            this.changeB = setTimeout(function() {
                this.b = 1;
            }.bind(this), 500);
        }
        else if (this.a == 1 && newA == 0) {
            this.b = 0;
        }

        this._a = newA;
    }
});

然后,您可以这样使用它:

// Immediately set to 0
obj.a = 0;
console.log(obj.b);

// Set to 1 and start the timeout
obj.a = 1;
console.log(obj.b);
setTimeout(function() {
    console.log(obj.b);

    // Set back to 0
    obj.a = 0;
    console.log(obj.b);

    // And hey, make sure changing a stops b from being set
    obj.a = 1;
    obj.a = 2;
    setTimeout(function() {
        console.log(obj.b);
    }, 500);
}, 500);

答案 1 :(得分:1)

我就是这样做的,只需定义一个可以访问外部范围的toggleA函数:

var a = 0, b, t,
toggleA = function() {
  switch(a) {
    case 0:
      a = 1;
      t = window.setTimeout(function(){ b = 1; }, 500);
      break;
    case 1:
      window.clearTimeout(t);
      a = b = 0;
      break;
  }
};

调用toggleA()会将a的值切换为1到0.取决于将a的值从1切换为0所需的时间,{{1}的值也可以改变。