出乎意料地通过引用传递整数?

时间:2009-03-25 16:13:17

标签: javascript jquery

我遇到了一些问题。出于某种原因,无论如何都始终使用相同的参数调用updateCurrentItem

function updatePromoList(query) {
    query = query.toUpperCase();
    clearCurrentList();
    var numItems = 0;
    currentItem = 0;

    result_set = cached[query.charAt(0)][query.charAt(1)][query.charAt(2)];

    for(i in result_set){
        if(numItems >= NUMBER_MATCHES){
            $("<li/>").html("<span style='color: #aaa'>Please try to limit your search results</span>").appendTo("#possibilities").mouseover(function(event){ updateCurrentItem(numItems+1); });
            break;
        }

        promo = result_set[i];
        found_number = false;
        if (!promo.client)
            found_number = (promo.prj_number.toString().substr(0,query.length) == query) ? true : false;

        if (query.length >= MATCH_NAME) {
            if(promo.prj_name && typeof promo.prj_name == 'string'){
                found_name = promo.prj_name.toUpperCase().indexOf(query);
            } else {
                found_name = -1;
            }  
            if (promo.client)
                found_client = promo.client_name.toString().indexOf(query);
            else
                found_client = -1;
        } else {
            found_name = -1;
            found_client = -1;
        }

        if(found_client >= 0) {
            var thisIndex = numItems+1;
            console.log("setting", thisIndex);
            $("<li/>").text(promo.client_name).bind('click',function(e){ updatePromoChoice(e,promo); }).appendTo("#possibilities").mouseover(function(event){ updateCurrentItem(thisIndex); });        } else if(found_name >= 0 || found_number) {            var thisIndex = numItems+1;
            console.log("setting", thisIndex);
            $("<li/>").text(promo.prj_number+": "+promo.prj_name).bind('click',function(e){ updatePromoChoice(e,promo); }).appendTo("#possibilities").mouseover(function(event){ updateCurrentItem(thisIndex); });
        }

        if(found_number || found_client >= 0 || found_name >= 0){
            numItems++;
        }
    }
}


function updateCurrentItem(i){
    currentItem = i;
    console.log("updating to", i);
}

运行此结果的结果是:

setting 0
setting 1
setting 2
setting 3
setting 4
setting 5
setting 6
setting 7
setting 8
setting 9
setting 10
setting 11
setting 12
setting 13

然后当我将鼠标移动到包含<li>mouseOver事件的内容区域时,我看到的只有:

updating to 4

始终 4.任何想法?

1 个答案:

答案 0 :(得分:2)

您正在创建一个闭包但它仍然绑定到numItems变量:

function(event){ updateCurrentItem(numItems+1); }

你应该做的是这样的事情:

(function(numItems){return function(event){ updateCurrentItem(numItems+1); }})(numItems)

编辑:我想我可能有错误的功能,但适用同样的原则:

function(event){ updateCurrentItem(thisIndex); }

应该是

(function(thisIndex)
{
    return function(event){ updateCurrentItem(thisIndex); }
})(thisIndex)