返回函数调用和三级条件不起作用

时间:2012-11-14 00:50:07

标签: javascript jquery

我有一段时间试图解决这个问题。我有一个函数返回另一个函数的值。在第二个函数中,我有一个三级条件,它不会得到那个回报..我无法弄明白。我确信这是一个范围问题,但我无法解决它。这都在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
                     )
                  }
               }
            },

所以最终发生的事情是我得到一个&#34; null&#34;在storeReturn数组中,因为在某些条件中第一个第三级失败。我无法进入它......进行测试。

&#34; _getDBdata()&#34;函数只返回基于其他一些数据的哈希值。

有关正在发生的事情的任何想法?我尝试了一切,但无法解决这个范围/结束问题。

3 个答案:

答案 0 :(得分:3)

首先:这是非常令人费解的,你应该停止这样做。把它分成几部分。

第二:在这种情况下你永远不会调用匿名函数,你只是简单地返回它。添加另一组()将解决这个问题,以便您调用它并返回其值:

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

答案 1 :(得分:1)

__returnFilteredData()内的三元语句中,根据self.url的真实性,你会返回两个可能的东西中的一个。无论返回什么,都会从您提供给$.map()的回调中返回。

如果self.url真实,则返回一个函数:

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

...但如果self.url是假的,则返回调用函数的结果:

                  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()永远不会进入主undefined块,if也可以返回undefined。在某些情况下,__returnFilteredData()可能是可接受的结果,但对于当前的代码结构来说,这是显而易见的。

如果您删除了匿名函数和三元并且使用if / else if / else if编码{{1}}来使用{{1}}结构,那么 将更清晰,更容易维护。

答案 2 :(得分: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();
    }
},