3

ここで「リセット」機能がどのように機能するのか理解できず、このスクリプトを作成しました! 8行目の「値」変数...どのようにゼロにリセットされ、次の行の iterator("value++") によって取得されるのですか? イテレータとスクリプト全体が関数のスコープ外にあると思っていたでしょうか?

var timer = null, 
    interval = 1000,
    value = 48;

$("#start").click(function() {
  if (timer !== null) return;
  timer = setInterval(function () {
      $("#reset").click(function() { value = 0} );
      value++;
      $("#input").val(value);
  }, interval); 
});

$("#stop").click(function() {
  clearInterval(timer);
  timer = null
});

JSFIDDLE

4

4 に答える 4

3

あなたの例では、クロージャーやバインディングに関する凝った説明さえ必要ありません。

valueグローバル スコープで定義しました。に渡された関数は、setIntervalその値を繰り返しインクリメントして#input要素を更新し、バインドされた関数#resetはそれをゼロに設定します。どちらの関数も、グローバル スコープの変数にアクセスできます。

于 2013-07-30T00:29:00.237 に答える
2

var のスコープは、valueその関数内の他のすべての関数からアクセスできますdocument ready (あなたの場合は (それがある場合は、それ以外の場合は完全にグローバルな var 名です))。別の方法は、あなたをObject**
に定義することです。これにより、すべての外部および他の関数に対してもグローバルになりますvarwindow

「通常の」方法といくつかの即時呼び出し関数式を使用した例で、違いを明確に確認してください。

var text = "Hello!"; // Global

(function sayhello(){
   alert(text); // Ok, works
})();

http://jsbin.com/apuker/2/edit

(function defineVar(){
  var text = "Hello!"; // Private
})();

(function sayhello(){
   alert(text); // No dice
})();

http://jsbin.com/apuker/4/edit

(function defineVar(){
  window.text = "Hello!";
})();

(function sayhello(){
   alert(text); // Watta?... IT WORKS!
})();

そしてところで、あなたのコードは次のようになるはずです:(とより良いことに注意してください)#resetif (timer) return;

var timer = null, 
    interval = 1000,
    value = 48;

$("#start").click(function() {
  if (timer) return;           // return - if timer is not null (true).
  timer = setInterval(function () {
      value++;
      $("#input").val(value);
  }, interval); 
});

$("#reset").click(function() {
    value = 0;
});

$("#stop").click(function() {
  clearInterval(timer);
  timer=null;
});
于 2013-07-30T00:36:24.327 に答える
2

あなたの例でvalueは、グローバルスコープで定義されているため、どこからでもアクセスできます。そのため、要素をクリックするresetと、グローバルvalueは 0 に戻されます。

次のように変更します。

$("#reset").click(function() { var value = 0} );

valueその関数のみをスコープとする別の変数を作成します。

于 2013-07-30T00:25:47.687 に答える