Javascript 理解闭包和范围
出于某种原因(可能是因为我不理解闭包),函数Javascript 理解闭包和范围,javascript,jquery,closures,Javascript,Jquery,Closures,出于某种原因(可能是因为我不理解闭包),函数inResult总是返回false,循环永远不会执行。当然,我确信resultcontains具有正确的属性 function hasId() {return $(this).prop('id');} function inResult(res) { return res.hasOwnProperty($(this).prop('id'));} $.ajax({ url : opt.url, d
inResult
总是返回false
,循环永远不会执行。当然,我确信result
contains具有正确的属性
function hasId() {return $(this).prop('id');}
function inResult(res) { return res.hasOwnProperty($(this).prop('id'));}
$.ajax({
url : opt.url,
data : $.extend(true, opt.data, {ids: ids}),
context : this, // A collection of elements
type : 'POST',
dataType : 'json',
success : function(result) {
// Filter elements with id and with a property in result named "id"
this.filter(hasId).filter(inResult(result)).each(function() {
console.log($(this).prop('id'));
});
}
});
编辑:工作代码解决方案(感谢Šime Vidas为我指出了正确的方向):
试试这个:
this.filter( hasId ).filter( function () {
return inResult( result );
}).each( function () {
console.log( this.id );
});
在您的代码中有.filter(inResult(result))
,它不起作用,因为您正在立即调用inResult
,并将该调用的结果(一个布尔值)传递给filter()
,而这不适用于布尔值
你也可以这样做:
var keys = Object.keys( result );
var filtered = this.filter( function () {
return this.id && keys.indexOf( this.id ) > -1;
});
Object.keys(result)
从result
返回一个包含所有自己属性名的数组,该.id
工作正常。不需要prop()
@ŠimeVidas,谢谢你的提示。闭包不是特定于jQuery的,它们是JavaScript功能之一。@zizozu你说得对,谢谢你的编辑。filter()
可以与返回布尔值的函数一起使用,因此,我认为我的没有任何问题。@Gremo,但您没有将函数传递给filter()
。您正在向它传递一个布尔值<代码>过滤器(true)不工作。你必须给它传递一个函数,明白了!因此,唯一的方法是将che调用包装到一个新的函数中
?猜猜为什么hasId
会起作用…@Gremo有bind
函数方法,所以.filter(inResult.bind(this,result))
也会起作用。(但是,bind
未在IE8和Safari中实现,因此您必须在网页中包含ES5垫片。)但是this
内的inResult
关键字仍将引用窗口对象。。。
var keys = Object.keys( result );
var filtered = this.filter( function () {
return this.id && keys.indexOf( this.id ) > -1;
});