我有一段时间试图解决这个问题。我有一个函数返回另一个函数的值。在第二个函数中,我有一个三级条件,它不会得到那个回报..我无法弄明白。我确信这是一个范围问题,但我无法解决它。这都在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;函数只返回基于其他一些数据的哈希值。
有关正在发生的事情的任何想法?我尝试了一切,但无法解决这个范围/结束问题。
答案 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();
}
},