我有一个简单的脚本,它调用在调用函数中设置的函数...
但是我收到了“未定义的函数”错误。
我的脚本是:
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
为什么会这样?
答案 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时调用。