如何在javascript中使用作用域?为什么这个功能有效?

时间:2013-07-30 00:21:40

标签: javascript jquery

我根本不明白“重置”功能在这里是如何工作的,我创建了这个脚本!第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 个答案:

答案 0 :(得分:3)

在您的示例中,您甚至不需要任何涉及闭包或绑定的花哨解释。

您已使用全局范围定义value。传递给setInterval的函数反复递增该值并更新#input元素,绑定到#reset的函数将其设置为零。这两个函数都可以访问具有全局范围的变量。

答案 1 :(得分:2)

在您的示例中,value在全局范围内定义,因此可以在任何地方访问它。因此,点击元素reset后,全局value将重新设置为0。

将其更改为:

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

将创建一个仅限于该函数的单独value变量。

答案 2 :(得分:2)

该函数内的所有其他函数都可以访问var value的范围 (在你的情况下document ready(如果你有它,否则它完全是一个全局var名称。))。
另一种方法是将var定义为window对象**,这将使其对所有外部函数和其他函数都是全局的

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

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

和BTW,您的代码应如下所示:(请注意#reset和更好的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;
});

答案 3 :(得分:0)

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

在你的脚本中,虽然你使用var关键字声明'value',但你可以在任何函数之外声明它,从而使它成为一个全局变量。

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