簡體   English   中英

如何在javascript中使用作用域?為什么這個功能有效?

[英]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
});

的jsfiddle

在您的示例中,您甚至不需要任何涉及閉包或綁定的花哨解釋。

您已使用全局范圍定義了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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM