3

我根本不明白这里的“重置”功能是如何工作的,我创建了这个脚本!第 8 行的“value”变量...如何重置为零,然后由下一行的迭代器(“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 名称。))。
另一种方法是定义你varwindowObject** 这将使它对所有外部函数和其他函数也是全局的

使用“通常”方式和一些立即调用函数表达式的示例可以清楚地看到区别:

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!
})();

顺便说一句,您的代码应如下所示:(注意#resetand the nicer if (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 回答
0

从 ECMAScript 5 开始,只有函数范围。默认情况下,所有变量都是全局变量,除非使用 'var' 关键字声明,在这种情况下,它们仅在声明它们的函数中可见。

在您的脚本中,尽管您使用 var 关键字声明“值”,但您在任何函数之外声明它,有效地使其成为全局变量。

仅供参考:目前计划通过新的 'let' 关键字在 ECMAScript 6 中引入具有块范围的变量声明功能。

于 2013-07-30T00:47:43.430 回答