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



我花了很多时间试图弄清楚这一点。我有一个函数,它返回另一个函数的值。在第二个函数中,我有一个第三条件,它不会得到这个返回。。我想不通。我确信这是一个范围问题,但我无法解决。这一切都在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()"函数只是返回一个基于其他数据的散列。

有什么想法吗?我尝试了所有方法,但无法解决这个范围/关闭问题。

首先:这非常复杂,您应该停止这样做。把它掰成几块。

第二:在这种情况下,你永远不会调用匿名函数,你只是返回它。添加另一组()会解决这个问题,这样你就可以调用它并返回它的值:

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

__returnFilteredData()内部的三元语句中,根据self.url的真实性,返回两种可能的内容之一。返回的内容都将从您提供给$.map()的回调中返回。

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

(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 "})"
)
}
}
},

但即使这样,匿名函数仍然可以返回CCD_ 8,因为它没有CCD_。此外,如果__returnFilteredData()从未进入主if块,则它可以返回undefined。对于某些情况,undefined可能是一个可以接受的结果,但对于当前的代码结构来说,这还远远不够明显。

如果删除匿名函数和三进制编码的__returnFilteredData()以使用if / else if / else if结构,则将更加清晰和易于维护。

只是一个注释:

你是说你不能让if..else工作,但我认为你看不到森林。如果你去掉了匿名函数,你也去掉了self,整个过程就会变得简单得多。

注意,无论this.url的计算结果是true还是false,您仍然调用this._getDBdata(),因此您只需要有条件地执行"更多条件"部分:

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

最新更新