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