2017-02-17 52 views
-2

我正在通過製作項目來學習JavaScript。我無法理解全局變量。在這個例子中,當我給你variable = result; UB的randomvariable()功能,對test()功能的開關參數,它不工作從全局變量訪問switch語句參數值

function randomvariable() { 
    var myarray = new Array; 

    myarray = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20] 
    randomvariable = Math.floor(Math.random() * 0); 
    result = (myarray[randomvariable]); 
    } 

function test() {  
    switch (result) { 
     case 0: 
     alert("haahhaha"); 
     break; 
    } 
} 

回答

2

在JavaScript中,當你聲明一個變量的函數內var,該變量是從訪問只有那個功能。如果您不用var聲明變量,它將變爲(默認情況下)爲全局變量,並且可以從任何地方訪問。這是一個不好的做法,應該避免。爲了避免混淆,聲明一個變量應該總是明確地完成。

現在,問題在於您必須執行包含變量範圍變量的函數才能生效。在你的情況下,你永遠不會執行randomvariable函數,所以result = ...永遠不會被執行,並且全局變量不會被創建。另外,你也不會調用test函數。

此外,您正在重新分配函數的randomevariable值到隨機計算的結果。這不是你應該做的。相反,您可以使用函數return或者只是將函數設置爲變量。

// Declare result in the Global scope 
 
var result = null; 
 

 
function randomvariable() { 
 
    var myarray = new Array; 
 

 
    myarray = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]; 
 
    
 
    // This is the correct code for getting one of the array values randomly, 
 
    // but we'll comment it out here so that we can force the value of 0 for 
 
    // testing purposes 
 
    //result = (myarray[Math.floor(Math.random() * myarray.length)]); 
 
    result = 0; 
 
} 
 

 
function test() { 
 
    // Generate the random number by invoking the function that does that work 
 
    randomvariable(); 
 
    
 
    // Now, the global has a value assigned to it 
 
    console.log(result); 
 
    
 
    switch (result) { 
 
    case 0: 
 
     alert("haahhaha"); 
 
     break; 
 
    } 
 
} 
 

 
// Now, invoke test to get the whole thing working 
 
test();

說了這一切,應該爲他們創造與存在於同一範圍內的其他變量發生碰撞的可能性,避免全局變量。總是試着給你的變量提供一個可以讓你的代碼運行的最小範圍。全球臭蟲是臭名昭着的來源。

+0

謝謝你的解釋 – zexurity