javascript中的变量范围 - 如果在for循环之前声明了变量,那么在for循环之后它的值是不是可以访问?

时间:2014-03-28 08:36:47

标签: javascript html

我在函数中声明了一些变量,并且它们的值在for循环中得到更新。在function的末尾,我希望看到其中一些变量的最终值。

花了一整天的时间来解释为什么我的想法没有发生,我在这里发布功能以获得一些见解。

在函数中,您可以看到两个alert - 第一次运行for的每次迭代,并给出变量的当前值。我不想要这个警报,但是已经将它插入到这里只是为了表明代码确实在for loop内完成了我想要它做的事情。

我想要的只是最后一个alert ....但由于某种原因它永远不会出现!

据我了解,如果在函数的开头声明了一个变量,它的值可以直到最后一次访问......如果这是正确的,为什么最后的警报不会出现?

注意:此代码正在MsWord生成的html上运行,其中包含无数不必要的span标记,我需要删除它才能将内容用于文档目的。无法获得这些值是阻止我完成一个小工具的原因,我打算用它来为一个项目转换大约400个MsWord页面!

function uponetag()
{
    var spank=document.getElementsByTagName('span'); //look at all span tags
    var spann=spank.length; //number of span tags on the page
    var yes=0;
    var no=0;

    for (i=0; i<=spann; i++)
        {

            var spancont=spank[i].innerHTML;
            //get the parent node
            var outer = spank[i].parentNode;
            outertag=outer.tagName.toLowerCase();

            //get the inner html of the parent node
            var outercont=outer.innerHTML;
            //create a string manually placing the opening and closing span tags around the current span content
            var compareit=("<span>"+spancont+"</span>");

            //compare the manual string to inner content of the parent node
            if (outercont===compareit)
            {

                //replace the inner html of the parent node with the current span content
                outer.innerHTML=spancont;
                yes=yes+1;
            }

            else
            {
                no=no+1;
            }
            alert ("Converted = "+yes+"\n\n Not converted = "+no); //this alert works
        }
    alert ("The page originally had "+spann+" span tags. \n ON EXIT: Converted = "+yes+"\n\n Not converted = "+no);
    //THIS ALERT DOESN'T!!! WHY?????
}

我已尝试过这里建议的所有更改(i = spannum,var1 = ....等),但没有成功!实际上,在执行此操作时,我发现虽然原始页面中有49个跨度,但是在29次运行(20 yeses和9 nos)之后,脚本会在firebug控制台中抛出错误。

2 个答案:

答案 0 :(得分:4)

代码读取超出数组长度,导致错误。

这就是为什么循环警报会触发但是循环外的最终警报不会触发。

此循环

for (i=0; i<=spann; i++)

包括i = spann,超过结束时为1。

我认为您打算使用

for(i=0;i<spann;i++)

这是正确的。

我还应该注意Javascript没有块级变量。它有function个范围的变量。在var循环块中声明for与在当前var初始化时声明function(称为提升)并在循环中设置它相同。 / p>

答案 1 :(得分:0)

for (i=0; i<=spann; i++)
//change it to :
for (i=0; i<spann; i++)