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 数组中得到一个“null”,因为在某些条件下,第一个三级失败。我无法进入它...进行测试。

“_getDBdata()”函数只返回一个基于其他数据的哈希值。

关于正在发生的事情有什么想法吗?我尝试了所有方法,但无法解决此范围/关闭问题。

4

3 回答 3

3

首先:这太令人费解了,你应该停止这样做。把它分成几块。

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

__returnFilteredData: function(i){
              var self = this;
                if(some_conditionals){
                   return (
                     self.url ?
                     (function(){
                         if(some_more_conditionals){
                             return self._getDBdata();
                         }
                    })() : self._getDBdata()
                   )
                }
             }
          },
于 2012-11-14T00:58:54.817 回答
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();
    }
},
于 2012-11-14T03:28:08.917 回答
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()可以返回。在某些情况下,可能是可以接受的结果,但这对于当前的代码结构来说远非显而易见。undefinedifundefined

如果您删除匿名函数和三元并编码为使用结构,它将更加清晰和易于维护。__returnFilteredData()if / else if / else if

于 2012-11-14T01:11:39.963 回答