2

これが私の問題です。インクリメント ボタンを押した後、y は 7 に等しくなりますが、z は 8 に変化せずに 7 のままです。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

4 に答える 4

3

変数に保持されている値zは、変数に割り当てた瞬間に計算されます。

var z=1+y;

変更したい場合は、手動で更新する必要があります。

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

ほとんどのコンピューター言語はそのように振る舞うと私は信じています。


JavaScript やその他の言語では、"getter" と "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

于 2013-06-26T03:38:29.093 に答える
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

ある変数を別の変数の値に依存させたい場合、それらに新しい値を割り当てることはできません。ゲッターとセッター関数を使用する必要があります。

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=2z を設定する改行が表示されているため、値を myObj.y または myObj.z に代入することはできません。

これが起こらないようにするには、x と y を非公開にする必要があります。JavaScript では、クロージャーを使用してプライベート変数をシミュレートできます。

次のコードに関する警告: オブジェクトの複数のインスタンスを作成する場合は、コンストラクター関数_privateVarを使用し、プロトタイプを使用しないことを計画していない限り、JS はそれをサポートしていないため、実際のプライベート性の代わりにコード規則 ( など) を使用してプライベート変数を使用します。 .

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

get および set で bfavaretto の構文を使用すると、新しい値を割り当てることができますが、内部的に 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
于 2013-06-26T03:31:45.420 に答える
1

zの値を割り当てると、別の場所が参照され、 と の間にz = 1 + yそれ以上の関係はありませんzy

于 2013-06-26T03:28:20.233 に答える
1

これを行う 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`
于 2013-06-26T03:30:33.470 に答える