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

时间:2012-05-22 22:35:36

标签: javascript

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

但是我收到了“未定义的函数”错误。

我的脚本是:

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

为什么会这样?

3 个答案:

答案 0 :(得分:4)

范围问题在于定义了“del_msg”:您需要将该函数放在全局范围内,但是您要在函数“messages_document”(具有自己的范围)中创建它。 / p>

答案 1 :(得分: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);

答案 2 :(得分:0)

尝试将其声明为

var del_msg = function(id)...

抱歉迷茫。您正在使用窗口范围上的函数,请将其声明为其他函数。

使用onclick全局范围调用该函数。

你在这里要了解的是你正在创建html代码,但onclick会在用户点击时调用,而不是在你创建html时调用。