2017-02-20 210 views
0
calValue: function (data) { 
      var self = this; 
      var values = data.values; 
      for (var i = 0; i < data.length; i++) { 
        if(data.condition == 0){ 
        (function (values) { 
          for (i = 0; i < values.length; i++) { 
          } 
        })(values) 
        } 
        else{ 
          //do sth else 
        } 
      } 
    } 

我的理解是每個函數都有自己的上下文,並且聲明裏面的變量,只會在內部生效。像上面的代碼片段一樣,我期望內部for循環中的「i」變量不會影響外部的「i」變量。但是,事實是它確實會影響。javascript中的變量範圍

有人請幫忙解釋一下嗎?謝謝。

+2

這是因爲您不會在第二個內部函數中重新聲明'i',所以它使用的是外部函數中的'i',而不是它自己的內部副本。 –

+0

謝謝丹尼爾。有道理。 – connie

回答

1

隨着var聲明,範圍在function級別。這樣的聲明被解釋爲它們出現在封閉函數的開頭。

在現代JavaScript環境中,let聲明允許您創建作用域爲本地語句塊的變量。 (另外const爲不可修改的符號。)

在你的情況下,嵌套函數中的內部i只是指外部聲明的i。從一個函數內部,你總是可以「看到」出來,但是你不能「看見」。這就是範圍的工作原理。

+0

謝謝尖尖的。 – connie