Javascript 在另一个函数中调用的未定义函数

Javascript 在另一个函数中调用的未定义函数,javascript,Javascript,我有一个简单的脚本,它调用一个函数,这个函数是在调用的函数中设置的 但我得到一个“未定义函数”错误 我的剧本是: function messages_document(messages){ messages = JSON.parse(messages); function del_msg(id){ result = call_file('del.php',id); if(result){ messages[id].leng

我有一个简单的脚本,它调用一个函数,这个函数是在调用的函数中设置的

但我得到一个“未定义函数”错误

我的剧本是:

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(''));
}
功能消息\u文档(消息){
messages=JSON.parse(messages);
函数del_msg(id){
结果=调用文件('del.php',id);
如果(结果){
消息[id]。长度=0;
}
}
var输出=[];
输出.推送('

My Messages



'); for(消息中的变量id){ 输出推送(“”); } document.getElementById('main').innerHTML=(output.join(''); }
我很好奇我是否误解了scope的工作原理,因为我得到:

没有定义del_msg


你知道为什么吗?

你在定义“del_msg”的范围上有问题:你需要该函数在全局范围内,但你在函数“messages_document”(有自己的范围)内创建它。

试着像这样声明它

var del_msg = function(id)...

抱歉搞糊涂了。您正在窗口作用域上使用函数,请在其他函数之外声明它

使用onclick全局作用域调用该函数


这里您需要了解的是,您正在创建html代码,但是当用户单击时,而不是创建html时,将调用onclick。

函数语句是在当前范围内定义的,而不是全局定义的。在这种情况下,这意味着
del_msg
仅存在于
messages\u document
的范围内。但是,您可以通过
onclick
属性调用它:这些属性是全局计算的。由于
del_msg
在全球范围内不存在,因此它不起作用

你有两个选择。一种是在任何其他函数之外定义
del_msg
global。但是,这会污染全局名称空间,这通常是一件坏事。最好将其应用于范围内的
元素。这将需要通过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);
var para=document.createElement('p'),
身份证件
链接
para.innerHTML='我的消息



'; para.align=‘中心’; 用于(消息中的id){ link=document.createElement('a'); link.href=''; link.onclick=del_msg; link.innerHTML=“删除邮件”; 第3段(链接); } document.getElementById('main').appendChild(第段);
这就是我困惑的原因,因为我在messages\u document函数中调用了它。。那么,如果它也是在该函数中创建的,那么肯定应该设置它吗@Niko@Dave-不,它必须是gloabal,仅仅移动它有那么大的问题吗?不-只是它似乎有不同的作用域规则,我了解到PHPYou是如何将它作为事件处理程序附加到
元素的-所以当用户实际单击该链接时,该函数从不同的上下文执行。Put
window.del\u msg=del\u msg在“messages\u document”的结尾处,我看到了一个快速且(非常)肮脏的修复程序。哦,我明白了-因为我这样称呼它,它在函数的“外部”寻找它,它在函数中被调用。至少我现在看到了使用DOM而不是innerHTML的一个很好的好处:)!这是最好的方法吗?我以前从未使用过DOM方法。。我打算添加的不仅仅是单击(div和text等)。还有其他处理方法,例如事件委派。最好的技术取决于你实际做了什么。尝试创建一个收件箱和链接是为了“删除邮件”我不知道如何添加其余的内部html数据,如邮件文本等。对不起,我忘了添加链接内容。现在改变了。