嵌套函数中数组的范围

时间:2014-05-21 09:42:14

标签: javascript nested scope

我有一个类HashTable,其中包含一个方法addItem,如果一个项目不存在并且已成功添加(我检查它正在工作),则返回true。

在下面的函数顶部,将创建一个新的HashTable对象。 嵌套函数应该使用此对象hashTable的addItem方法。 不幸的是,范围存在问题。在嵌套函数中,hashTable在编辑时不会被涂成蓝色,并且(实际上)在运行时会出现一条消息,指出addIten方法不存在。

function getHashTableFolders_(folder)
{
   var hashTable = new HashTable();

   function getFolderCollection_(folder)
   { // Recursively fill the hashTable
      if (hashTable.addItem(folder) === true)
      { 
         var subFolders = folder.getFolders();
         var numSubFolders = subFolders.length;
         for (var i=0; i<numSubFolders; i++) getFolderCollection_(subFolders[i]); 
      }
   } 

   getFolderCollection_(folder); // Start the process

   return hashTable;
} 

如何在嵌套函数中引用对象hashTable并使用其方法addItem?

3 个答案:

答案 0 :(得分:0)

你可以使这成为可能,只需在**

之前进行hashTable声明

getHashTableFolders _

**功能,

var hashTable = new HashTable();
function getHashTableFolders_(folder)
{

   function getFolderCollection_(folder)
   { // Recursively fill the hashTable
      if (hashTable.addItem(folder) === true)
      { 
         var subFolders = folder.getFolders();
         var numSubFolders = subFolders.length;
         for (var i=0; i<numSubFolders; i++) getFolderCollection_(subFolders[i]); 
      }
   } 

   getFolderCollection_(folder); // Start the process

   return hashTable;
} 

答案 1 :(得分:0)

使用函数作用域对我来说很好,因为你没有在内部函数中重新定义hashTable,所以作用域将使用对外部作用域的对象的回退。 http://jsbin.com/fedela/1/edit

(对于HashTablefolder使用Polyfill,因为它们不是由OP提供的):

var HashTable = function( ) {
  var obj =  {
    folders: [],
    addItem: function(x) { obj.folders.push( x.name ); return true; }
  };
  return obj;
};

var a = {
  name: "a",
  getFolders: function() { return [];}
};
var b = getHashTableFolders_({
  name: "b",
  getFolders: function() { return [a]}
});

将导致b.folders // ["b","a"]

答案 2 :(得分:0)

我将所有代码复制到新的GAS中(并在进行备份后)销毁了用于制作库的旧GAS。

新的GAS可以使用,所以我猜它与使用早期版本的库有关。

感谢所有人如此迅速地做出回应。