2017-02-14 217 views
-2

当使用for..in构造循环JavaScript对象时,我偶然发现了这个令人费解的错误。我有一组的虚拟数据与此类似:JavaScript内部变量undefined For循环中

{ 
    "12345678" : { 
    ... 
    }, 
    "12345679" : { 
    ... 
    }, 
    "12345680" : { 
    ... 
    } 
} 

也许它很重要,这个目的是从火力地堡数据库使用检索到的响应的内置.val()方法。这是一个普通的js对象。

但是,在遍历对象时,内部的内部的for..in循环在某种程度上未定义。我已经删除除循环中的所有周围的代码,并且仍然出现错误:

for (key in data) { 
console.log(data[key]); 
} 
// Throws ReferenceError: key is not defined 

我真是百思不得其解。这怎么可能?我认为传递给for..in的变量在循环内总是可用(或至少定义)。

+1

你是否在某处定义了'key'?像'for(var key in data)'?另外,你是否尝试用'JSON.stringify(data,null,4)'这样的东西打印'data'? – mc10

+0

嗯,那很愚蠢。没有在任何地方声明为'var'。我一直在这半个小时左右都在搞这个。我想是时候睡觉了。 – ppajer

回答

1

正如我在评论中提及,你可能会需要定义key;否则,你会(可能)定义一个全局变量,它可能会或可能不会正常工作。此外,为避免出现在你的循环无关的属性,使用hasOwnProperty

for (var key in data) { 
    if (!data.hasOwnProperty(key)) { 
     continue; 
    } 

    console.log(data[key]); 
} 

进一步的信息,请参阅How do I loop through or enumerate a JavaScript object?

+0

感谢您对'hasOwnProperty'的建议。最初的错误是一个疏忽,但这是我应该真正开始使用的东西。 – ppajer

0

你只是不使用正确的语法for..in声明。 您需要定义key变量,var(或let如果你使用ES6):为了在声明中使用它:

for(var key in data){ 
    console.log(data[key]) 
} 
+0

就是这样,谢谢!我认为当人们开始忽略像这样的东西时,该睡觉了。 :) – ppajer