2

呼び出しが行われる関数に設定されている関数を呼び出す簡単なスクリプトがあります...

しかし、「未定義関数」エラーが発生します。

私のスクリプトは次のとおりです。

function messages_document(messages){
    messages = JSON.parse(messages);

    function del_msg(id){
        result = call_file('del.php',id);
        if(result){
            messages[id].length = 0;
        }
    }

    var output = [];
    output.push('<p align="center"><b><u>My Messages</u></b></p> <br/><br/>');

    for(var id in messages){
        output.push('<a href="#" onclick="del_msg('+id+')">Delete Message</a>');
    }

    document.getElementById('main').innerHTML = (output.join(''));
}

スコープがどのように機能するかを誤解したかどうか、私は興味があります:

del_msg が定義されていません

これはなぜですか?

4

3 に答える 3

4

「del_msg」が定義されているというスコープに問題があります。その関数はグローバルスコープにある必要がありますが、関数「messages_document」(独自のスコープを持つ)内で作成しています。

于 2012-05-22T22:38:51.487 に答える
3

関数ステートメントは、グローバルではなく、現在のスコープで定義されます。この場合、del_msgは のスコープ内にのみ存在することを意味しますmessages_document。ただし、onclick属性を介して呼び出します。これらの属性はグローバルに評価されます。グローバルに存在しないためdel_msg、機能しません。

2 つのオプションがあります。1 つはdel_msg、他の関数の外側で定義することにより、グローバルにすることです。ただし、これはグローバル名前空間を汚染します。これは一般的に悪いことです。aスコープ内の要素に適用することをお勧めします。これには、HTML ではなく DOM メソッドを介して要素を構築する必要があります。

var para = document.createElement('p'),
    id,
    link;
para.innerHTML = '<b><u>My Messages</u></b></p> <br/><br/>';
para.align = 'center';

for(id in messages){
    link = document.createElement('a');
    link.href = '';
    link.onclick = del_msg;
    link.innerHTML = "Delete message";
    para.appendChild(link );
}

document.getElementById('main').appendChild(para);
于 2012-05-22T22:45:58.707 に答える
0

のように宣言してみてください。

var del_msg = function(id)...

混乱してすみません。ウィンドウスコープで関数を使用している場合は、他の関数から宣言してください。

この関数は、onclick グローバル スコープで呼び出されます。

ここで理解しなければならないのは、html コードを作成しているということですが、onclick は、html を作成するときではなく、ユーザーがクリックしたときに呼び出されます。

于 2012-05-22T22:40:41.970 に答える