Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/427.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 理解闭包和范围_Javascript_Jquery_Closures - Fatal编程技术网

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;
});