2017-04-15 60 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变量。否则它应该是一个常数。

顺便说一句,分析抛出什么类型的异常以及它提供了什么信息是很有用的。

相关问题