2012-11-14 29 views
0

我有一個時間的魔鬼試圖弄清楚這一點。我有一個函數返回另一個函數的值。在第二個函數中,我有第三個條件,它不會得到那個返回值。我無法弄清楚。我相信這是一個範圍問題,但我無法解決它。這全都在jquery插件中。返回函數調用和三級條件不工作

somefunctionA: function(){ 
    var self = this; 
    var data = somecollection_of_data; 
    var storeReturn = $.map(data, function(obj, i) { 
          return (function(i){ 
           return self._returnFilteredData(id); 
          })(obj.i); 
      }); 
}, 

    __returnFilteredData: function(i){ 
       var self = this; 
        if(some_conditionals){ 
        return (
         self.url ? 
         (function(){ 
          if(some_more_conditionals){ 
           self._getDBdata(); <<-- NEVER FIRES OFF 
          } 
         }) : self._getDBdata() <<--- THIS ONE FIRES OFF 
        ) 
        } 
       } 
      }, 

等什麼最終發生的是我,因爲在一些條件語句是第一個第三未能得到一個「空」的storeReturn陣列英寸我無法進入...去測試。

「_getDBdata()」函數只是基於其他數據返回散列。

關於發生了什麼的任何想法?我嘗試了一切,我無法解決這個範圍/關閉問題。

+0

凡定義'self'?我在'someFunctionA'中看不到它。 – jfriend00

+1

從'$ .map'中使用的回調匿名函數返回的自執行函數中使用的函數返回的函數。如果你不能編寫(和調試)如此複雜的代碼 - 從一些簡單的工作開始,並逐步使其更加複雜。 – zerkms

+1

三元語句通常不能很好地處理一堆函數調用和if/else語句,它們僅用於簡單比較。嘗試用if/else語句替換它,看看是否有效。 – adeneo

回答

3

首先:這是非常複雜的,你應該停止這樣做。分解成單獨的部分。

第二:在這種情況下你永遠不會調用匿名函數,你只是簡單地返回它。添加另一套()會解決這個問題,讓你怎麼稱呼它,並返回其值:

__returnFilteredData: function(i){ 
       var self = this; 
       if(some_conditionals){ 
        return (
        self.url ? 
        (function(){ 
         if(some_more_conditionals){ 
          return self._getDBdata(); 
         } 
        })() : self._getDBdata() 
        ) 
       } 
      } 
      }, 
+0

哇,夥計..我完全nubbed它。我一定會過度的......我不敢相信我沒有抓住那個..哇。我看到你也在anon函數中加入了「return」,是的 - 它需要兩者。謝謝一堆。我只是需要一些敏銳的眼光。大項目,我只是vegged。再次感謝。巨大的幫助。 –

+0

+1「First ...」。 – RobG

1

三元語句中__returnFilteredData()你,取決於self.url的感實性,返回的兩個可能的事情之一。無論返回的是從您提供給$.map()的回調中返回。

如果self.url是truthy,返回一個函數:

    (function(){ 
         if(some_more_conditionals){ 
          self._getDBdata(); <<-- NEVER FIRES OFF 
         } 
        }) 

...但如果self.url是falsy,返回調用函數的結果:

    self._getDBdata() 

在的情況下,匿名函數,沒有任何實際調用它,但即使某些事情確實調用了匿名函數,但它實際上並未返回結果,但它有條件地調用self._getDBdata()而不返回結果。

你可以改變這一個立即調用匿名函數返回一個結果:

__returnFilteredData: function(i){ 
      var self = this; 
      if(some_conditionals){ 
       return (
       self.url ? 
       (function(){ 
        if(some_more_conditionals){ 
         return self._getDBdata(); // added "return" 
        } 
       })() : self._getDBdata()   // added "()" after "})" 
       ) 
      } 
     } 
     }, 

...但即使如此,匿名函數仍然可以返回undefined,因爲它沒有else情況。如果__returnFilteredData()從未進入主if區塊,也可以返回undefined。在某些情況下,undefined可能是可接受的結果,但對於當前的代碼結構而言,這是遠遠不夠的。

這將是更清晰,更易於維護,如果你刪除匿名函數和三元和編碼__returnFilteredData()使用的if/else if/else if結構。

+0

謝謝你的簡潔迴應...是的,我確實試圖簡化它,這可能是因爲我超累,並沒有直接思考,但如果/其他條件根本不起作用。你會認爲這將是一件容易的事,但也許在我疲憊的時候,我忽略了一些事情。但是,是的,我先去if/else來解決它。稍後我會研究它,看看爲什麼這是一個問題。 –

1

只是評論:

你是說你不能得到if..else工作,但我認爲你不能只見樹木不見森林。如果你擺脫匿名功能,你也擺脫了self,整個事情變得非常簡單。

注意this.url結果是否爲真或假,你還是叫this._getDBdata(),所以你只需要有條件地做了「一些條件語句」部分:

__returnFilteredData: function(i) { 
    if (some_conditionals) { 
     if (this.url) { 
      if (some_more_conditionals) { 
       // do stuff 
      } 
     } 
     return this._getDBdata(); 
    } 
}, 
+0

我聽到你在說什麼。我讓它變得非常簡單。只是如果/其他等..但它不會工作。 Literall,只有一個if/else。我認爲有一些關於.map所強加的範圍(或特定的邏輯)。我會嘗試重做很簡單,只是爲了確保,但我正在通過這麼多的排列,沒有任何工作。我可能會錯過一些東西 - 可能是這種情況。 –