为什么这些全局变量在3个函数之间消失?

时间:2014-02-06 12:01:47

标签: javascript jquery

我有三个函数,它们是按照这个顺序触发的示例:

function editmatch(){
        defaultstyling();
        $('.all_cons').css({display: 'none'});
        $('.confirm_button'+id).css({display: 'inline'});
        storecontents();
        isediting = true;
        $(document).find("td[id^='hero_column"+id+"']").html('<input id="select_hero" type="text" name="select_hero">');
        $(document).find("td[id^='result_column"+id+"']").html("<select name='winloss'><option value='Win'>Win</option><option value='Loss'>Loss</option></select>");
        $(document).find("td[id^='gamemode_column"+id+"']").html('<select name="gamemode"<option value="All Pick">All Pick</option><option value="Captains Mode">Captains Mode</option><option value="Captains Draft">Captains Draft</option></select>');
        $(document).find("td[id^='mmr_column"+id+"']").html('<input id="input_mmr" type="text" name="input_mmr">');
}

摘要:函数将单元格内的文本更改为“表单”(仍未完成)。在更改单元格内的文本之前,将触发storecontents()函数。就在这里:

function storecontents(){   //HOLDS CONTENTS OF ROW
    var herotemp = document.getElementById("hero_column"+id).innerHTML;
    var resulttemp = document.getElementById("result_column"+id).innerHTML;
    var gametemp = document.getElementById("gamemode_column"+id).innerHTML;
    var mmrtemp = document.getElementById("mmr_column"+id).innerHTML;
    alert(herotemp);
}

此函数在更改单元格之前将文本存储在单元格内。请注意,这些变量是在我的编码页面顶部全局定义的。此警报显示herotemp为其之前的html:“Rubick”。

然后,按钮会触发此代码(如有必要)以将内容更改回原始代码:

function abandonedit(){
       alert(herotemp);
       $(document).find("td[id^='hero_column"+id+"']").html(herotemp);
        $(document).find("td[id^='result_column"+id+"']").html(resulttemp);
        $(document).find("td[id^='gamemode_column"+id+"']").html(gametemp);
        $(document).find("td[id^='mmr_column"+id+"']").html(mmrtemp);
}

但是,上述函数中的警报显示herotemp变量(以及所有其他变量)为空。我认为全局声明的变量可用于所有函数?我做错了什么或者我误解了吗?

2 个答案:

答案 0 :(得分:1)

如果你在函数中使用 var ,这将只在 这个函数中声明这个变量。如果您将变量声明为具有相同名称的全局变量。

生成全局变量或使用全局变量只需删除 var

答案 1 :(得分:0)

如果您声明变量usin var herotemp,您将拥有一个名为herotemp的本地(函数范围)变量,该变量会阻止您访问全局变量herotemp

这应该将您的代码修复为预期的行为。

function storecontents(){   //HOLDS CONTENTS OF ROW
    /*var*/ herotemp = document.getElementById("hero_column"+id).innerHTML;
    var resulttemp = document.getElementById("result_column"+id).innerHTML;
    var gametemp = document.getElementById("gamemode_column"+id).innerHTML;
    var mmrtemp = document.getElementById("mmr_column"+id).innerHTML;
    alert(herotemp);
}

有时候想要名为x的本地(函数范围)变量以及名为x的全局变量。为了实现这一目标,您必须执行以下操作:

var x = 3;

function useX() {
    var x = 5;
    alert(x, window['x']);
}

或者:

var x = 3;

function useX(x) {
    alert(x, window['x']);
}