我根本不明白“重置”功能在这里是如何工作的,我创建了这个脚本!第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 :(得分: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中声明具有块范围的变量的能力。