Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript中的作用域是如何工作的?这个函数为什么工作?_Javascript_Jquery - Fatal编程技术网

javascript中的作用域是如何工作的?这个函数为什么工作?

javascript中的作用域是如何工作的?这个函数为什么工作?,javascript,jquery,Javascript,Jquery,我只是不明白“重置”函数是如何工作的,我创建了这个脚本!第8行的“value”变量…如何重置为零,然后由下一行的迭代器(“value++”)拾取?我会认为迭代器和整个脚本超出了函数的范围 var timer = null, interval = 1000, value = 48; $("#start").click(function() { if (timer !== null) return; timer = setInterval(function () {

我只是不明白“重置”函数是如何工作的,我创建了这个脚本!第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
});

在您的示例中,
值是在全局范围内定义的,因此可以在任何地方访问。因此,单击元素
重置
,全局
被设置回0

将其更改为:

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

将创建一个单独的
变量,其作用域仅限于该函数。

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


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

该函数中的所有其他函数都可以访问var
值的范围
(在您的案例中,
文档准备就绪(如果您有它,否则它完全是一个全局变量名)
另一种方法是将您的
var
定义到
窗口
对象**,这将使其对所有外部和其他函数也是全局的

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

var text = "Hello!"; // Global

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



顺便说一句,您的代码应该如下所示:(注意
#reset
和更好的
if(timer)return;


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

在脚本中,尽管您使用var关键字声明了“value”,但在任何函数之外声明它实际上使其成为一个全局变量

供参考:
目前有计划在ECMAScript 6中引入通过新的“let”关键字声明具有块作用域的变量的功能。

FYI:jQuery不是语言,javascript是。每次您在该setInterval中绑定该单击函数时,我只想让您知道它必须将另一个单击事件绑定在一起,因此无论
$(“#input”)如何.val()。但是这个新变量将是无用的,因为没有人可以使用它。@JuanGuerrero显然,这是一个例子来说明如何将变量的范围限定到函数中。这些变量不在全局范围内,因为他选择了JSFIDLE将代码包装到函数中的选项,请参见查看源代码:http://fiddle.jshell.net/qHL8Z/147/show/
这些变量不在全局范围内,因为他选择了JSFIDLE将代码包装到函数中的选项,请参见
查看源代码:http://fiddle.jshell.net/qHL8Z/147/show/
@Esailija拿着小提琴,因为他已经选择了domReady,显然这不是全局性的。但是既然代码是按原样发布在这里的,我想我们可以假设这就是目的,否则包装它的JSFIDLE代码就会发布在这里。@marteljn当然,但它仍然会使这个答案无效答案适用于这里提供的文本,这是大多数访问者都会读到的,这可能是询问者的全部想法。但奇怪的是:javascript函数在其定义上下文中引用的变量被“绑定”到新函数的上下文中,以便以后调用时继续可用。这称为词汇范围界定。这是一个合理的教程:谢谢Roko。你能准确地解释一下“if(timer)return”行在做什么吗?@Starkers你已经把
timer
设置为
null
。如果将
null
传递到
If
条件,则结果将是布尔
false
If
null
,并且将是
true
If(else)。因此,要继续此行,请说明如果
计时器
不是
“| | 0 | |未定义| | | false | | null | | | NaN
(存在)-->返回(立即退出单击函数)-->否则继续。因此,如果函数有:
if(true)return,那么此行将返回该函数
(function defineVar(){
  var text = "Hello!"; // Private
})();

(function sayhello(){
   alert(text); // No dice
})();
(function defineVar(){
  window.text = "Hello!";
})();

(function sayhello(){
   alert(text); // Watta?... IT WORKS!
})();
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;
});