1

我有以下一段代码。字符串正在uploadFile正确发送,但线路alert(str)给了我undefined

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很陌生,所以谁能告诉我为什么会这样?谢谢你

4

2 回答 2

0

事件处理函数接收一个参数:一个event对象。

您的事件处理程序

function(evt,str) { }

需要两个参数。自然,因为它没有收到第二个,所以str你得到的str是未定义的。

但是,如果您希望事件处理程序使用str定义为 的参数的变量,则function uploadFile(str){ }可以这样做,因为 evet 处理程序函数是在uploadFile(str){ }函数内部定义的。这称为闭包。只是改变

function(evt, str){ }

function(evt) { }

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

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

您将真正得到字符串的警报str

于 2012-07-20T11:36:59.167 回答
0

只需str从函数声明中删除

xmlhttp.addEventListener("load", function(evt){
     alert(str); //alerts str
}, false);
于 2012-07-20T11:32:57.437 回答