2013-05-30 67 views
2

我經常進來的情況下我的行爲,根據我的心情:在全球範圍內預定義變量的優點是什麼?

情況A):

function a() { 
    var msg = 'a()'; 
    ..operate on msg 
    } 

    function b() { 
    var msg = 'b()'; 
    ..operate on msg 
    } 

情況B):

var msg; 
function a() { 
    msg = 'a()'; 
..operate on msg 
} 

function b() { 
    msg = 'b()'; 
..operate on msg 
} 

注意與「對msg進行操作」我不是指一個函數,而是一堆的操作。

我在這很有趣,因爲JSHint指出變量已經儘管它們具有相同的名稱,但出現在例如不同的功能預定義。

更新: 當我問這個問題以清除已更改功能的情況時,我可能不正確。

UPDATE 2 我理解範圍。我的意思是,儘管範圍有其他優勢嗎?

+0

它不是不同的關閉。 – Diode

+0

這就是所謂的變量提升: http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html –

+0

@tracevipin我用「功能」取代了它。如果我有兩個函數定義了相同的變量名,linters就會生氣 –

回答

0

這裏幾乎沒有區別...在每種情況下,變量是定義的,但如果您不會使用msg變量,第一種情況會稍微節省數據:)但這是太簡單的任務。

+0

是的,這裏的優化是不存在的,但是我有很多文件需要用很多函數進行重構,如果語句全部重複定義相同的名字:) –

+0

我看到了...如果if你在多種情況下使用全局,你必須爲每種情況初始化它...在沒有重新初始化的情況下,你可以使用錯誤的數據,並導致邏輯錯誤... – Scientist42

+0

我認爲相同,但也許有更多的情況下考慮。無論如何感謝您的洞察力! :) –

0

您是否瞭解範圍?

在情況B中,您的變量僅在函數的範圍內可用。

function(){ 
    var foo = 10; 
} 
console.log(foo); //undefined 

在情況A你的變量是可用的全局。

var foo; 
function(){ 
    foo = 10; 
} 
console.log(foo); //10 

在情況A中,從函數內修改foo可以在任何地方修改它。在情況B中,只有局部變量被修改。

+1

對不起,我沒有提到它,但我理解範圍。我理解它是如何工作的,但是當重構時,我有大量的文件組成了許多使用相同變量名稱的函數。這是我的問題背後的推理 –

1

正如其他人建議你必須閱讀更多關於變量提升在Javascript中。 我會試着展示它。

function test() { 

    var t1 = msg + " hello"; 
    console.log(t1); // prints "undefined hello" because msg is undefined 
    var t2 = msgx + " hello"; // msgx ReferenceError 

    var a = 1; 
    var b = 2; 
    if (a > b) { 
     var msg = 'sample'; 
    } 

} 

test(); 

在此示例中,您可以看到msg已被聲明。但它是未定義的。另一方面,msgx會導致引用錯誤。它沒有在任何地方宣佈。所以關鍵是var msg = 'sample';這個函數後面的if括號裏面的函數使得msg成爲函數中無處不在的有效變量。所以再次聲明msg會給你預定義的變量警告。

在JavaScript中,只有一個函數可以創建一個範圍。即使有其他控制語句的內括號,函數中聲明的所有東西都可以在整個函數範圍中使用。在函數內的不同行中聲明的所有變量將被掛起並視爲在函數的起始行中聲明。