2014-05-21 4 views
0

J'ai une classe HashTable contenant une méthode addItem qui retourne true si un élément n'existait pas et a été ajouté avec succès (j'ai vérifié qu'il fonctionne).Portée d'un tableau dans une fonction imbriquée

En haut de la fonction ci-dessous, un nouvel objet de HashTable sera créé. Une fonction imbriquée doit utiliser la méthode addItem de cet objet hashTable. Malheureusement, il y a un problème avec la portée. A l'intérieur de la fonction imbriquée, hashTable ne sera pas coloré en bleu lors de l'édition et (en effet) à l'exécution, un message apparaît indiquant que la méthode addIten n'existe pas. Comment puis-je faire référence à l'objet hashTable dans la fonction imbriquée et utiliser sa méthode addItem?

+0

Il ne devrait pas y avoir de problème avec la portée ... fonctionne très bien pour moi: http://jsbin.com/fedela/1/edit – bbuecherl

+0

Ça marche aussi pour moi. Pourriez-vous afficher le code de la classe HashTable? –

+0

J'ai utilisé le code à partir de // https://script.google.com/d/1qxkczJ4kCF9JiTtJshFqwFTdduoihxAsd1V_h4V-jtwHoWMdpUqi7i_K/edit?usp=drive_web et ajouté une méthode addItem. – SoftwareTester

Répondre

0

Vous pouvez rendre cela possible, juste faire une déclaration Hashtable avant **

getHashTableFolders_

** fonction,

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

Cela signifie que 'getHashTableFolders_' ne créera pas de nouveau' HashTable' (ce que demande l'OP) mais en utilisera un pour chaque exécution. – bbuecherl

+0

Oui, vous avez raison. –

0

fonctionne bien pour moi en utilisant le champ de fonction, puisque vous n'êtes pas redéfinition hashTable à l'intérieur de la fonction interne, de sorte que la portée utilisera un repli sur l'objet de la portée externe. http://jsbin.com/fedela/1/edit

(L'utilisation d'un Polyfill pour HashTable et folder car ils ne sont pas fournis par 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]} 
}); 

qui se traduira par b.folders // ["b","a"]

0

Je copiais tout le code à un nouveau gaz et (après faire une sauvegarde) a détruit le vieux gaz que j'ai utilisé pour faire une bibliothèque. Avec le nouveau GAS, cela fonctionne, donc je suppose que cela a quelque chose à voir avec l'utilisation d'une version antérieure de la bibliothèque.

Merci à tous d'avoir répondu si rapidement.

Questions connexes