0

这段代码有什么问题

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
    "http://www.w3.org/TR/html4/strict.dtd">
<html>
    <head>
        <meta http-equiv="Content-type" content="text/html; charset=utf-8">
        <title>test</title>
        <script type="text/javascript" charset="utf-8">

            window.onload = function()
            {
                function addText() 
                {
                        var el = document.createElement('p');
                        el.innerHTML = 'This is test';
                        document.getElementById('b').appendChild(el);
                }

            }
        </script>
    </head>
    <body id="b">
        <a href="#" onclick="addText();">c</a>
    </body>
</html>

当我单击锚点时,我得到 addText 未定义。当我将 addText 函数放在 windowl.onload 匿名函数之外时,它可以工作

4

4 回答 4

0

我认为您正在创建的函数是 window.onload 上匿名函数的闭包,因此主范围看不到它。

我不直接了解 JS,但是在像 Clojure 这样的函数式语言中,您可以为函数命名以供其自我引用,但如果您不将其绑定到名称,它仍然是一个匿名函数。当您将其放在函数之外时,自引用名称也是该函数的绑定名称。

于 2012-06-20T14:44:21.710 回答
0

您正在另一个函数中定义一个函数,然后尝试调用该内部函数。

从 window.onload 函数中删除 addText() 的声明。

于 2012-06-20T14:45:55.283 回答
0

如果您在另一个函数 (Y) 中定义了一个函数 (X)(使用函数声明),那么 X 的作用域将限定为 Y,并且无法在其外部访问(除非您将其复制到全局变量中)。

我看不出定义该函数的任何理由onload,所以只需摆脱它的 onload 包装器。

于 2012-06-20T14:46:02.927 回答
0

addText仅在创建它的范围内可见。将其设置为您分配给的匿名函数,window.addText它将按预期工作:

window.addText = function() { ...
于 2012-06-20T14:46:48.777 回答