使javascript引用变量成为值变量?

时间:2010-02-04 01:20:02

标签: javascript variables reference

我有一个类似这样的javascript函数:

function doSomething(me) {
        var isMeChecked = me.checked;
        for (i=0;i<=10;i++) {
            me.checked = !isMeChecked;
            alert (me.checked);
        }
    }

我假设isMeChecked在第一次加载后保持不变,但它显然是me.checked的引用变量,因此它随着每次迭代而变化。 如何强制isMeChecked在首次加载时设置为me.checked的值,而不是me.checked的引用?

好吧,为了更清楚,我正在编辑这篇文章,以显示正在使用的实际代码,表现出不良行为:

以下是javascript函数:

function CheckAll(me, gridViewId) {
    var isMeChecked = (me.checked)?true:false;
    alert('CheckAllFired_1');
    Parent = document.getElementById(gridViewId);
    for (i = 0; i < Parent.rows.length; i++) {
        alert('CheckAllFired_2_' + i.toString());
        var tr = Parent.rows[i];
        var td = tr.childNodes[0];
        var item = td.firstChild;
        if (item.id != me.id && item.type == "checkbox") {
            alert('CheckAllFired_3_' + i.toString() + '_' + me.checked + '_' + isMeChecked);
            item.checked = !isMeChecked;
            item.click();
        }
    }
}
function CheckSelectAll(me, checkBoxHeaderId, gridViewId) {
    alert('CheckSelectAllFired_1');
    if (!me.checked) {
        alert('CheckSelectAllFired_2');
        document.getElementById(checkBoxHeaderId).checked = false;
        return;
    }
    else {
        alert('CheckSelectAllFired_3');
        document.getElementById(checkBoxHeaderId).checked = true;
        Parent = document.getElementById(gridViewId);
        for (i = 0; i < Parent.rows.length; i++) {
            alert('CheckSelectAllFired_4_' + i.toString());
            var tr = Parent.rows[i];
            var td = tr.childNodes[0];
            var item = td.firstChild;
            if (item.type == "checkbox") {
                alert('CheckSelectAllFired_5_' + i.toString());
                if (!item.checked) {
                    alert('CheckSelectAllFired_6_' + i.toString());
                    document.getElementById(checkBoxHeaderId).checked = false;
                    return;
                }
            }
        }
        return;
    }
}

我有一个asp.net gridview。第一列是一列复选框,标题中还有一个复选框,用于切换列中其他复选框的“选择/取消全选”。 标题中的复选框将onclick事件设置为onclick="CheckAll(this, 'myGridViewClientID')"

网格中的所有剩余复选框都将其onlick事件设置为onclick="CheckSelectAll(this, 'headerCheckBoxID', 'myGridViewClientID'"

在网格视图渲染时,headerCheckBoxIDmyGridViewClientID都在代码隐藏中设置。

我们的想法是,当选中标题中的复选框时,它会将所有其他复选框设置为相反的选中状态,然后触发其点击事件以模拟点击,并触发其onclick操作(涉及事物)比如更改行的颜色,如果选中行的数据键,则将其设置为SelectedValues数组等。

但是,我还希望子复选框具有以下行为: 1)如果取消选中任何一个,请取消选中“全选”复选框。 2)如果检查了所有这些,请选中“全选”复选框。

现在,因为子复选框的click事件有机会更改headercheckbox的已检查状态,当循环返回到“checkall”事件时,headercheckbox的状态与首次启动时的状态不同,因此,在尝试全部选择时,它最终只会检查第一个子复选框。

使用警报,我能够看到在CheckSelectAll函数中更改了headercheckbox的已检查状态时,对于产生CheckSelectAll函数的CheckAll函数中的“isMeChecked”值,该值也会更改。

那看起来非常像参考变量。我不知道如何阻止它这样做。

4 个答案:

答案 0 :(得分:4)

想一想。假设x.checked = true。运行doSomething(x)。 当函数启动时,me.checked为true。现在看看你的for循环:

传递1:me.checked是真的。所以isMeChecked是真的。所以你把me.checked设置为false。

传递2:me.checked是假的。 isMeChecked仍然是正确的,因为你不在循环中改变它。所以me.checked再次设置为false。

传球3:见第2传球。 ...

当函数退出时,isMeChecked为true,me.checked为false。你所做的就是将me.checked设置为false 10次。 这不是isMeChecked作为参考的问题(因为它不是),但如果你期望得到不同的结果,那只是你逻辑中的一个错误。

答案 1 :(得分:0)

除非我疯了,否则在javascript中没有引用布尔值的东西。他们总是按价值传递。您可以粘贴我们可以运行的完整示例代码而无需填写任何空白吗?

答案 2 :(得分:0)

你的循环刚好坏了 - 阅读评论

// doSomething({checked:true});
function doSomething(me) {
    // isMeChecked = true;
    var isMeChecked = me.checked;
    for (i=0;i<=10;i++) {
        // me.checked = false ... always...
        me.checked = !isMeChecked;
        alert (me.checked);
    }
}

答案 3 :(得分:-2)

你可以var isMeChecked = me.checked?true:false;

此外,me.checked != isMeCheckedme.checked = !isMeChecked不同,这可能与您的意图相同。