我可以在另一个变量中更改javascript变量吗?

时间:2013-06-26 03:23:22

标签: javascript variables increment

这是我的问题。点击增量按钮后,y等于7,但z保持等于7而不是更改为8.为什么不在其他变量中更新javascript变量?有这个问题的解决方案吗?我确定javascript的基本属性我无法理解,但我似乎无法弄明白。

<body>
<script>
var y=6;
var z=1+y;
</script>
<button onclick="y++">Increment</button>
<button onclick="alert(y)">What is y?</button>
<button onclick="alert(z)">What is z?</button>
</body>

4 个答案:

答案 0 :(得分:3)

变量z上保存的值是在您将其分配给变量时计算的:

var z=1+y;

如果您想要更改,则必须手动更新:

<button onclick="z=++y+1">Increment</button>

我相信,大多数计算机语言都是这样的。


在JavaScript和其他语言中,您可以使用“getters”和“setter”来实现您想要的功能,但代码将变得更加复杂。判断你是否真的认为有必要:

<body>
<script>
var vals = {
    _y : 0,
    z : 0,
    set y(val) {
        this._y = val;
    },
    get y() {
        this.z = this._y + 1
        return this._y;
    } 
}
vals.y = 6;
vals.z = 1 + vals.y;
</script>
<button onclick="vals.y++">Increment</button>
<button onclick="alert(vals.y)">What is y?</button>
<button onclick="alert(vals.z)">What is z?</button>
</body>

http://jsbin.com/udediy/1/edit


另一个更简单的解决方案是使用一个函数。这对你给出的例子很有用:

<body>
<script>
var y=6;
var z = function() {
    return 1+y;
}
</script>
<button onclick="y++">Increment</button>
<button onclick="alert(y)">What is y?</button>
<button onclick="alert(z())">What is z?</button>
</body>

http://jsbin.com/ojorax/1/edit

答案 1 :(得分:2)

设置z时会评估

y。那时y是6,所以z是7.当你增加y时,z不会被重新评估(如你所知)。

y=1;
z=++y;//increment y and assign the value to z
 // z will be 2;
z=y++;//set z to the value of y and then increment y
   // z is now 2 and y is 3

如果您希望一个变量依赖于另一个变量的值,您不能只为它们分配新值。你必须使用getter和setter函数:

var myObj={
  y:0,
  x:0,
  setY:function (value){
    this.y=value;
    this.x=value+1;
  },
  setX:function (value){
    this.x=value;
    this.y=value-1;
  }
}
myObj.setY(4);
console.log(myObj.x);//=5
myObj.y=2;//breaks setting x, you have to use setters
console.log(myObj.x);//=5

正如您所看到的,myObj.y=2行打破了设置z,因此您无法在不破坏它的情况下将值分配给myObj.y或myObj.z。

为防止这种情况发生,您必须将x和y设为私有。在JavaScript中,您可以使用closures模拟私有变量。

对于下载代码的警告:如果您计划创建对象的多个实例,请使用constructor functions并使用代码约定(如_privateVar)而不是真正的私有性使用私有变量除非您计划不使用原型,否则不支持它。

var myObj=(function(){
  var x=0;// x and y only exist in the funciton body
  var y=0;// you cannot access them in myObj.x or .y
  return{
    setX:function(value){
      //maybe check if value is a number here
      x=value;
      y=value-1;
    },
    setY:function(value){
      //maybe check if value is a number here
      y=value;
      x=value+1;
    },
    getX:function(){
      return x;
    },
    getY:function(){
      return y;
    }
  }
})();
myObj.setX(6);
console.log(myObj.getY());//logs 5
myObj.y=22;
console.log(myObj.getY());//still logs 5

将bfavaretto的语法与get和set一起使用,您可以分配新值,但内部JavaScript将使用getter和setter函数。这在IE8及其下的旧浏览器中不起作用。

var myObj={
  _y:0,
  _x:0,
  set y(value){
    this._y=value;
    this._x=value+1;
  },
  get y(){
    return this._y;
  },
  set x(value){
    this._x=value;
    this._y=value-1;
  },
  get x(){
    return this._x
  }
}
myObj.x=4;
console.log(myObj.y);//=3

答案 2 :(得分:1)

一种方法是将变量包装在一个对象中,该对象通过引用而不是值传递:

var obj = { y : 6 };
var obj_2 = obj;
alert(obj.y); //6
alert(obj_2.y); // 6
obj.y++;
alert(obj.y); // 7
alert(obj_2.y); // 7`

答案 3 :(得分:0)

一旦您指定了z = 1 + y z的值,就会引用不同的位置,zy之间没有进一步的关系