Javascript 将字符串传递给事件侦听器,并给出NULL

Javascript 将字符串传递给事件侦听器,并给出NULL,javascript,Javascript,我有下面的代码。字符串被正确地发送到上传文件,但行警报(str)给出了未定义 function uploadFile(str){ alert(str); //prints correctly var fileTag = document.getElementById('fileinput'); var file = fileTag.files[0]; var xmlhttp=new XMLHttpRequest(); var formData = new

我有下面的代码。字符串被正确地发送到
上传文件
,但行
警报(str)
给出了
未定义

function uploadFile(str){
    alert(str); //prints correctly
    var fileTag = document.getElementById('fileinput');
    var file = fileTag.files[0];
    var xmlhttp=new XMLHttpRequest();
    var formData = new FormData();
    formData.append("thefile", file); 
    xmlhttp.addEventListener("load", function(evt,str){
         alert(str); //undefined
    }, false);
    ....
}

我对javascript相当陌生,有人能告诉我为什么会发生这种情况吗?谢谢

只需从函数声明中删除
str

xmlhttp.addEventListener("load", function(evt){
     alert(str); //alerts str
}, false);

事件处理程序函数接收单个参数:
事件
对象

您的事件处理程序

function(evt,str) { }
需要两个参数。当然,由于它没有收到第二个,
str
,您会发现
str
是未定义的

但是,如果希望事件处理程序使用定义为
函数uploadFile(str){}
参数的
str
变量,则可以这样做,因为evet处理程序函数是在
uploadFile(str){}
函数中定义的。这叫做闭包。换衣服

function(evt, str){ }

这样,您就可以删除
str
的内部定义,它隐藏了
uploadFile(str)
中的外部定义。所以在

xmlhttp.addEventListener("load", function(evt,str){
     alert(str);
}, false);

您将真正收到字符串
str

的警报,是什么让您认为加载事件处理程序将接收两个参数?
xmlhttp.addEventListener("load", function(evt,str){
     alert(str);
}, false);