2014-05-21 145 views
0

我有一个类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?

+0

范围不应该有问题...适合我的工作:http://jsbin.com/fedela/1/edit – bbuecherl

+0

它也适用于我。你能显示HashTable类的代码吗? –

+0

我使用了https://script.google.com/d/1qxkczJ4kCF9JiTtJshFqwFTdduoihxAsd1V_h4V-jtwHoWMdpUqi7i_K/edit?usp=drive_web 中的代码,并添加了addItem方法。 – SoftwareTester

回答

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; 
} 
+0

这意味着'getHashTableFolders_'不会创建一个新的'HashTable'(这是OP所要求的),而是每执行一次就使用一个 – bbuecherl

+0

是的,你是对的。 –

0

工作正常,我使用功能余地,因为你不在内部函数中重新定义hashTable,因此作用域将使用回退到外部作用域的对象。 http://jsbin.com/fedela/1/edit

(使用填充工具为HashTablefolder,因为它们不是由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"]

0

我复制所有代码到一个新的天然气和(后做备份)摧毁了我用来制作图书馆的旧气体。

随着新的GAS工作,所以我想它与使用早期版本的库有关。

感谢所有人的回应如此之快。