[英]How does scoping work in javascript? Why does this function work?
我根本不明白“重置”功能如何在這里工作,我創建了這個腳本! 第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
});
在您的示例中,您甚至不需要任何涉及閉包或綁定的花哨解釋。
您已使用全局范圍定義了value
。 傳遞給setInterval
的函數重復遞增該值並更新#input
元素,綁定到#reset
的函數將其設置為零。 這兩個函數都可以訪問具有全局范圍的變量。
在您的示例中, value
在全局范圍內定義,因此可以在任何位置訪問它。 因此,在單擊元素reset
,全局value
將重新設置為0。
將其更改為:
$("#reset").click(function() { var value = 0} );
將創建一個僅限於該函數的單獨value
變量。
var value
的范圍可由該函數內的所有其他函數訪問(在您的情況下document ready
(如果您有它,否則它完全是一個全局var名稱。))。
另一種方法是將var
定義到window
Object **,這將使它對所有外部函數和其他函數都是全局的
使用“通常”方式和一些立即調用函數表達式的示例,以清楚地看到差異:
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;
});
從ECMAScript 5開始,只有函數范圍。 默認情況下,所有變量都是全局變量,除非使用'var'關鍵字聲明,在這種情況下,它們僅在聲明它們的函數中可見。
在您的腳本中,雖然您使用var關鍵字聲明'value',但您可以在任何函數之外聲明它,從而有效地使其成為全局變量。
僅供參考:目前計划通過新的'let'關鍵字引入在ECMAScript 6中聲明具有塊范圍的變量的能力。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.