2014-05-21 193 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工作,所以我想它與使用早期版本的庫有關。

感謝所有人的迴應如此之快。