2014-11-20 20 views
1

看來JS strict mode不允許聲明隱式全局變量,但不影響在條件(if)或循環(while)中定義的變量的訪問。在C#中,您無法訪問在外部條件或循環內聲明的變量。在JavaScript中,然而,以下工作:本地/ web服務器和JS Bin測試之間的好奇區分差異

 "use strict"; 
     (function() { 
      var mybool = true; 
      if (mybool) { 
       var test = "test;  
       console.log(test);  //"test" 
      } 
      console.log(test);   //"test" 
     }()); 

breaks in JSBin和的jsfiddle,說test1超出範圍。

爲什麼它在我的網絡服務器上工作,但在其他地方打破了?什麼是在條件和循環等範圍內的規則?JavaScript是否應該像C#這樣?

回答

1

我認爲你越來越嚴格的模式和JSHint錯誤困惑。

在JSBin,JSHint is issuing the 'test1' used out of scope error。這與嚴格模式無關。在你的網絡服務器上,一切正常,因爲嚴格模式對這種可變範圍問題沒有意見。 JSBin爲你運行JSHint,你的web服務器可能不是。

在條件和循環等範圍內的規則是什麼... JavaScript應該像C#這樣?

號JavaScript有沒有塊範圍,但它確實有功能範圍。這意味着如果一個變量在塊內聲明(如if語句或循環結構),它的聲明將被「懸掛」到函數的頂部。查看variable declaration hoisting的更多文章。

特別是對於你的代碼,它的解釋,就好像你寫這樣的:

(function() { 
    var mybool = true, 
     test; /* = undefined */ 

    if (mybool) { 
     test = "test;  
     console.log(test);  //"test" 
    } 
    console.log(test);   //"test" 
}()); 

爲了避免這種混亂在JavaScript中的範圍,這是一個good practice聲明所有變量在他們所在的函數的頂部(因爲這是他們實際上確定了範圍的地方)。

+0

Yeap我在中途意識到這與'use strict'無關' - 我以爲JSBin可能使用'use strict;'這是導致兩者之間的問題。感謝你! – Growler 2014-11-20 21:00:19

+0

@Growler:沒問題,很樂意幫忙 – 2014-11-20 21:02:43

相關問題