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 関数から 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 に答える
0

あなたが作成している関数は、window.onload の無名関数のクロージャーだと思うので、メイン スコープには表示されません。

私はJSを直接知りませんが、Clojureのような関数型言語では、自己参照のために関数に名前を付けることができますが、名前にバインドしないと無名関数のままです。関数の外に置くと、自己参照名は関数のバインド名でもあります。

于 2012-06-20T14:44:21.710 に答える