2012-07-20 4 views
1

다음 코드가 있습니다. 문자열이 uploadFile으로 올바로 전송되었지만 alert(str) 줄이 undefined입니까?NULL을주는 이벤트 리스너에 문자열 전달

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); 
    .... 
} 

나는 자바 스크립트에 상당히 익숙해 누구도 왜 이런 일이 일어 났는지 말할 수 있습니까? event 객체 : 당신이

+0

로드 이벤트 처리기가 두 개의 인수를받는다고 생각합니까? – Quentin

답변

0

이벤트 핸들러 함수가 단일 매개 변수를 수신에서 str을 제거 감사합니다.

이벤트 핸들러

function(evt,str) { } 

는 두 개의 매개 변수를 예상하고있다. 당연히 두 번째 것을받지 못하기 때문에 str, str은 정의되지 않습니다.

당신이 당신의 이벤트 핸들러 그러나, function uploadFile(str){ }의 매개 변수로 정의 된 str 변수를 사용하려는 경우 evet 핸들러 함수가 uploadFile(str){ } 함수 내에서 정의되어 있기 때문에, 당신은 그렇게 할 수 있습니다. 이를 클로저 (closure)라고합니다. 그냥

function(evt) { } 

에이 방법을

function(evt, str){ } 

을 변경, 당신은 uploadFile(str)에서 외부를 가리는 str의 내부 정의를 제거합니다. 따라서

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

str의 경고가 표시됩니다.

0

그냥 함수 선언

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