2017-08-16 46 views
5

我有一個函數可以搜索文件夾樹並找到選定文件夾的父文件夾。無法在javascript/Polymer中調用我的遞歸函數

這是功能。

 getParentFolder: function (searchroot, childFolder) { 
      searchroot.subfolders.forEach(function (folder) { 
       if (folder.key == childFolder.key) { 
        return searchroot; 
       } 
       else { 
        if (folder.subfolders) { 
         return this.getParentFolder(folder, childFolder); 
        } 
       } 
      }); 
     } 

當我把這個與this.getParentFolder(rootFolder, childFolder);

它僅僅只是給我:遺漏的類型錯誤:this.getParentFolder不是函數 這是爲什麼?在同一個文件中,我稱其他函數完全正常。這是我無法打電話的唯一功能。是因爲遞歸嗎?

回答

5

當您在forEach方法中更改上下文時,必須將this保存在變量中。

getParentFolder: function(searchroot, childFolder) { 
    var self = this; 
    searchroot.subfolders.forEach(function(folder) { 
    if (folder.key == childFolder.key) { 
     return searchroot; 
    } else { 
     if (folder.subfolders) { 
     return self.getParentFolder(folder, childFolder); 
     } 
    } 
    }); 
} 

此外,return聲明將不會按您想要的方式工作。我建議你使用一個for循環來枚舉數組:

getParentFolder: function(searchroot, childFolder) { 
    for (var i = 0; i < searchroot.subfolders.length; i++) { 
    var folder = searchroot.subfolders[i]; 
    if (folder.key == childFolder.key) { 
     return searchroot; 
    } else { 
     if (folder.subfolders) { 
     return self.getParentFolder(folder, childFolder); 
     } 
    } 
    } 
} 
+0

所以這是否意味着每次我在任何循環中調用此函數都是因爲javascript的本質,我不得不每次重新將它分配給自己? – nanobots

+1

當然,如果你想跟蹤你的主要對象。或者,你可以使用['bind'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind) –

+1

@nanobots,你可以傳遞外部'this '作爲'forEach'的參數,避免了使用'self'。 –

3

的問題是,你的this是你傳遞到forEach函數內部不同。您需要將外this綁定到內部功能:

getParentFolder: function(searchroot, childFolder) { 
    searchroot.subfolders.forEach(function(folder) { 
    if (folder.key == childFolder.key) { 
     return searchroot; 
    } else { 
     if (folder.subfolders) { 
     return this.getParentFolder(folder, childFolder); 
     } 
    } 
    }, this); // pass in outer this as context for inner function 
} 

Array.prototype.forEach()上MDN:使用ES6

Syntax:

arr.forEach(function callback(currentValue, index, array) { 
    //your iterator 
}[, thisArg]); 

替代解決方案:

由於評論中提到的mishu,新的ES6箭頭語法也解決了這個問題。您在ES6代碼會是這個樣子:

getParentFolder: function(searchroot, childFolder) { 
    searchroot.subfolders.forEach((folder) => { 
    if (folder.key == childFolder.key) { 
     return searchroot; 
    } else { 
     if (folder.subfolders) { 
     return this.getParentFolder(folder, childFolder); 
     } 
    } 
    }); 
} 

箭功能是ES6不綁定this(見MDN),所以外this可以從箭頭功能中進行訪問。

請注意,並非所有瀏覽器都支持箭頭功能(請參閱Browser compatibility on MDN)。要支持較舊的瀏覽器,可以使用Babel將ES6轉換爲ES5。

+2

新的ES6箭頭語法是否也解決了這個問題,因爲沒有'this'的綁定? https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/Arrow_functions#No_binding_of_this – mishu

+1

@mishu,是的,更新我的答案包括。好建議! –