JavaScript中的局部和全局变量

JavaScript中的局部和全局变量,javascript,Javascript,今天,我开始编写一个页面,提示用户选择他们的PC规格,代码如下 <html> <title>Computer Specification Chooser</title> <head> <script type="text/javascript"> var compSpec = document.compChooser; functio

今天,我开始编写一个页面,提示用户选择他们的PC规格,代码如下

<html>
    <title>Computer Specification Chooser</title>

    <head>
        <script type="text/javascript">
            var compSpec = document.compChooser;

            function processorUnavailable_onclick()
            {
                alert("Sorry, that processor speed is currently unavailable.");
                compSpec.processor[2].checked = true;
            }
        </script>
    </head>

    <body>
        <form name="compChooser">
            <p>Tick all components you want included in your computer</p>

            <p>
            DVD-ROM

            <input type="checkbox" name="chkDVD" value="DVD-ROM" />
            <br />

            CD-ROM
            <input type="checkbox" name="chkCD" value="CD-ROM" />
            <br />

            Zip Drive
            <input type="checkbox" name="chkZIP" value="ZIP DRIVE" />
            </p>

            <p>
            Select the processor speed you require
            <br />

            <input type="radio" name="processor" value="3.8" />
            3.8 GHz

            <input type="radio" name="processor" value="4.8" onclick="processorUnavailable_onclick()" />
            4.8 GHz


            <input type="radio" name="processor" value="6" />
            6 GHz
            </p>

            <input type="button" name="btnCheck" value="Check Form" />
        </form>
    </body>

</html>

计算机规格选择器
var compSpec=document.compChooser;
函数处理器不可用\u onclick()
{
警报(“对不起,处理器速度当前不可用。”);
compSpec.processor[2]。选中=true;
}
勾选希望包含在计算机中的所有组件

DVD-ROM
只读光盘存储器
压缩驱动器

选择所需的处理器速度
3.8千兆赫 4.8千兆赫 6GHz

我面临的问题是与事件处理程序关联的函数。当我尝试选择处理器值4.8 GHz的单选按钮时,是的,它会用函数内的消息提醒我,但在这之后,它不会在函数内执行下一条语句,即检查下一个处理器值6 GHz

我尝试对其进行更改和测试,发现当我将
var compSpec=document.compChooser
设置为函数中的局部变量而不是全局变量时,可以执行下一条语句

但是我认为对于一个全局变量,它可以在页面上的任何地方访问,也可以在函数中访问。但是为什么现在我不能在我的函数中访问它呢


此外,我在谷歌搜索时偶然发现了一篇奇怪的文章。它表示在创建全局变量时,会将其添加到
窗口
对象中。为什么会发生这种情况?它的好处和用途是什么?

您的问题是这一行:
compSpec=document.compChooser

当此代码运行时,表单还不是DOM的一部分,因此
compSpec
是未定义的


将代码放在文档的末尾或在onload处理程序中运行,它就会工作。

在JavaScript中,全局变量是全局对象的属性。在浏览器中运行时,全局对象是
窗口
对象。因此,如果不使用
var
关键字,实际上并不是在声明变量,而是在设置
窗口
对象的属性。它很有用,因为
窗口
对象可以从任何地方访问,全局变量也是如此

如果将
compSpec
声明为
processorUnavailable\u onclick
函数中的变量(
var
),则其范围将限于该函数(以及在该函数中创建的闭包)。如果将
compSpec
设置为全局变量(即
window
的属性),则它将在任何地方都可用:

function body_onload()
{
    window.compSpec = document.compChooser;
}

function processorUnavailable_onclick()
{
    alert("Sorry, that processor speed is currently unavailable.");
    window.compSpec.processor[2].checked = true;
}

...<body onload="body_onload()">...
function body_onload()
{
window.compSpec=document.compChooser;
}
函数处理器不可用\u onclick()
{
警报(“对不起,处理器速度当前不可用。”);
window.compSpec.processor[2]。选中=true;
}
......

最后我知道问题出在解析上,但另一个问题是??为什么在创建函数之前调用函数时,仍然可以执行它??这是一个好问题,这里有一些好的答案:
title
标记不应该在
head
标记内吗?