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在全球范围内不存在,因此它不起作用。

你有两个选择。一种是del_msg通过在任何其他函数之外定义它来实现全局化。但是,这会污染全局命名空间,通常是一件坏事。最好将其应用于a范围内的元素。这将需要通过 DOM 方法而不是 HTML 来构建元素

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 回答