javascript中的作用域是如何工作的?这个函数为什么工作?
我只是不明白“重置”函数是如何工作的,我创建了这个脚本!第8行的“value”变量…如何重置为零,然后由下一行的迭代器(“value++”)拾取?我会认为迭代器和整个脚本超出了函数的范围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 () {
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
Ifnull
,并且将是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;
});