在下一行中丢失Javascript数组

时间:2014-12-06 18:01:58

标签: javascript

所以我面对的这个问题对我来说似乎很奇怪。似乎无法理解这里发生了什么。 我创建了一个新的数组。将其作为参数传递给填充它的函数。然后在控制台上记录该数组。它正确显示值。但是在下一行,如果我记录数组的长度,它给我一个0

} else {
  var path = new Array();         
  fetchPath(arr[index].parentId,path);
  console.log(path); 
  console.log(path.length);
} 

这是fetchPath

function fetchPath( id, path ) {    
  chrome.bookmarks.getSubTree(id, function(subtree) {
  path.push(subtree[0].title);
  if(subtree[0].hasOwnProperty('parentId')) {
    fetchPath(subtree[0].parentId,path);
  }  
}); 

这是我在控制台上获得的

Array[4]
0:"India"
1:"News"
2:"Bookmarks Bar"
3:""
length:4
>_proto_:Array[0]

0    

为什么报告的长度为零?事实上无论我尝试和做什么,它都失败了,因为我已经失去了它。 我把整个JS文件放在http://jsfiddle.net/1u4zngko/

2 个答案:

答案 0 :(得分:1)

getSubTree方法采用不立即执行的回调函数。

答案 1 :(得分:0)

这遇到与Why is my variable unaltered after I modify it inside of a function? - Asynchronous code reference中显示的问题相同的问题,但您还有其他问题,然后再回来。

某些浏览器控制台将保留对传递的对象的引用。因此,首先调用异步getSubTree(),然后记录当前为空的数组及其长度。 但是,因为控制台会保留对您的数组的引用,当您打开它时,它现在会显示已填充的数组。但是,数字按值传递,因此不会更新。

如果您使用console.log(path.slice())记录数组的克隆,则可以看到这一点 - 它应该为空。


我会在fetchPath()中使用回调函数修复此问题,如下所示:

function fetchPath( id, path, callback ) {    
  chrome.bookmarks.getSubTree(id, function(subtree) {
  path.push(subtree[0].title);
  if(subtree[0].hasOwnProperty('parentId')) {
    fetchPath(subtree[0].parentId,path,callback);
  }
  else {
     callback();
  }
});