0

ボタン1とボタン2の2つのボタンがあります。そして、私は次のコードを持っています:

$(document).ready(function() {
  var message = "hello 1";
  $("#button1").on("click", function() {
    alert(message);
  });
  message = "hello 2";
  $("#button2").on("click", function() {
    alert(message);
  });
});

button1 をクリックすると、「hello 2」が表示されます。これで閉鎖になると思ったので、「hello 1」が表示されます。助けてください

4

4 に答える 4

3

クロージャは変数の値を保存しません。特定のローカル変数インスタンスを保存するだけです。したがって、代入message = "hello 2"は両方のクロージャにある変数を更新します。

于 2013-10-22T18:18:37.183 に答える
1

グローバル変数messageを定義し、それに値を割り当てています。とき。on('click'...スタッフが実行されると、message変数の名前は、関数が定義された時点での値ではなく、新しく作成された関数に埋め込まれます。

したがって、これらのボタンを実際にクリックすると、JS は関数に埋め込まれた変数 NAME を取得し、その CURRENT 値 (「hello 2」) を検索し、出力が表示されます。

あなたが信じられないほど速く、ブラウザーの実行が比較的遅い場合、JS エンジンがまだ実際にその行の実行を開始できていない場合は、おそらくあなたをクリックしてを取得できます#button1。しかし、それは本質的に不可能です。あなたはそんなに速くない。hello 1message = 'hello 2';

于 2013-10-22T18:18:37.003 に答える
0

これらはクロージャーですが、両方のクロージャーがmessage変数を参照しています。オンクリック関数が呼び出される#button1と (ユーザーがクリックすると)、変数の現在の値が使用されます。これは、ready 関数の終了前にmessage変更されます。"hello 2"

以下の例のように、異なるメッセージに同じ変数を再利用しないことで、これを回避できます。

$(document).ready(function() {
  var message1 = "hello 1";
  $("#button1").on("click", function() {
    alert(message1);
  });
  var message2 = "hello 2";
  $("#button2").on("click", function() {
    alert(message2);
  });
});
于 2013-10-22T18:25:09.417 に答える