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

str関数宣言から削除するだけです

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

イベントハンドラー関数は、オブジェクトという1つのパラメーターを受け取りeventます。

イベントハンドラー

function(evt,str) { }

2つのパラメーターが必要です。当然、2番目のものを受け取らないので、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 に答える