2017-04-15 74 views
-1

我有一個數組設置,它將傳入兩個參數到函數中。但是,當我使用console.log時,我得到一個異常。這很奇怪,因爲如果我從參數中刪除參數,它會運行,是他們的任何原因,我該如何解決?Javascript Uncaught TypeError:無法讀取未定義的屬性「長度」(使用數組)

var musicians = ["Paul", "John", "Yuri"]; 

var instruments = ["Drums", "Guitar", "Chelo"]; 

function theBeatlesPlay(musicians, instruments) { 

    var empty = []; 

    for (var i = 0; i < **musicians.length**; i++) { 

     var str = musicians[i] + " plays " + instruments[i]; 
     empty = str; 
     **console.log(empty)**; 
    } 
    } 

    theBeatlesPlay(); 
+0

您沒有將任何參數傳遞給被調用的方法。 –

+0

調試你的程序。在'for'語句中放置一個斷點。當你在那裏停下來時,檢查'音樂家'的價值。然後認真思考。 – 2017-04-15 11:55:39

+0

棉絨將提供線索。例如,它可能會報告「音樂家」和「樂器」被宣佈但從未使用過。有些人也可能會報告在外部作用域中使用的函數參數** shadow **變量。 – 2017-04-15 16:36:56

回答

2

您必須在調用它時將參數傳遞給該函數。

theBeatlesPlay(musicians, instruments);

var musicians = ["Paul", "John", "Yuri"], 
 
    instruments = ["Drums", "Guitar", "Chelo"]; 
 

 
function theBeatlesPlay(musicians, instruments) { 
 
    var empty = []; 
 
    for (var i = 0; i < musicians.length; i++) { 
 
    var str = musicians[i] + " plays " + instruments[i]; 
 
    empty = str; 
 
    console.log(empty); 
 
    } 
 
} 
 

 
theBeatlesPlay(musicians, instruments);

0

你的問題是,你是不是傳遞函數的自變量。 使用函數的正確方法是首先調用函數的代碼,然後調用函數。如果使用更多的功能,你將失去跟蹤的你在做什麼或者更糟將開始得到錯誤,

var musicians = ["Paul", "John", "Yuri"]; 
 

 
var instruments = ["Drums", "Guitar", "Chelo"]; 
 

 
var errlog = theBeatlesPlay(musicians, instruments); 
 

 
console.log(errlog); 
 

 
function theBeatlesPlay(musicians_val, instruments_val) { 
 

 
var empty = []; 
 

 
for (var i = 0; i < musicians_val.length; i++) { 
 

 
var str = musicians_val[i] + " plays " + instruments_val[i]; 
 
     empty = str; 
 
     
 
    } 
 
    return empty; 
 
} 
 

 

+0

總是更好地解釋問題是什麼,以及如何修復它。 – 2017-04-15 11:54:45

0

說明:當你聲明一個函數的參數,這些參數成爲當地那些。這意味着,即使你有名字musiciansinstruments一些變量,具有相同名稱的參數範圍內的功能仍然會被視爲當地

要解決你的問題,你有兩種方式:

  1. 刪除函數聲明語句的參數(原來要訪問其聲明的功能以外的變量,所以你不需要參數你的函數):

    var musicians = ["Paul", "John", "Yuri"], 
        instruments = ["Drums", "Guitar", "Chelo"]; 
    
    
    /* Precondition: defined musicians and instruments arrays outside of a function */ 
    function theBeatlesPlay(/* No params */) { 
    
        var empty = []; 
    
        for (var i = 0; i < musicians.length; i++) { 
    
         var str = musicians[i] + " plays " + instruments[i]; 
         empty = str; 
         console.log(empty); 
        } 
    } 
    
  2. 調用函數傳遞給它先前宣佈的兩個數組:

    /* 
        musicians and instruments variables are LOCAL for the function in this case 
    */ 
    function theBeatlesPlay(musicians, instruments) { 
    
        var empty = []; 
    
        for (var i = 0; i < musicians.length; i++) { 
    
         var str = musicians[i] + " plays " + instruments[i]; 
         empty = str; 
         console.log(empty); 
        } 
    } 
    
    theBeatlesPlay(musicians, instruments); 
    

我還強烈建議您不要監守它是空的最初名稱,比如empty變量。否則它應該是一個常數。

順便說一句,分析拋出什麼類型的異常以及它提供了什麼信息是很有用的。

相關問題