2012-06-22 2 views
2

을 정의되지 않은 :자바 스크립트 변수가 예기치 않게 코드 블록의 경우

if(!skipit) 
    { 
    var update_argument=''; 
    if (document.formname.fieldname) 
     { 
     update_argument=document.formname.fieldname[document.formname.fieldname.selectedIndex].value; 
     } 
    window.setTimeout('updatepcols(update_argument)',250); 
     return false; 
    } 

내가 "update_argument는"정의되지 않은 것을 내에서는 setTimeout 호출에서 오류가 발생했습니다. 내가 "var"에서 "window."로 널 문자열 값을 할당 한 줄을 변경하면 오류가 사라지고 코드가 작동합니다. 여기에 범위 문제가 있다고 생각 하겠지만, 나는 그것을 따라 가지 않습니다. 이 경우 update_argument가 정의되지 않은 이유는 무엇입니까?하지만이를 window 객체에 넣으면 사용할 수 있습니까? (updatepcols는 가격 열을 업데이트하는 함수입니다.)

답변

4

대신 사용해보십시오. 이 방식에 closure를 사용하면 update_argument가있는 지역의 범위를 벗어난 즉, 전역 범위에서 실행, 당신이 평가 텍스트로 전달 된 스크립트를 느낌 재미가 update_argument

setTimeout(function(){ 
    updatepcols(update_argument); 
},250); 

에 대한 참조를 보존 선언했다.

window.setTimeout('updatepcols('+update_argument+')',250); 

이 바이올린은 보여줍니다 : http://jsfiddle.net/mLrqZ/

+1

이유가 무엇인지 설명 할 수 있습니다. – jfriend00

+1

문자열을'setTimeout'에 전달하면 전역 범위에서'eval'd가되기 때문에 이것은 작동합니다. 함수를 전달하면 로컬 변수를 읽을 수 있습니다. –

+1

P. 함수를'setTimeout'에 항상 전달하는 것은 좋은 습관입니다. 문자열을 전달하지 마십시오. –

1

는 잘 모르겠어요 . 당신이 당신의 콜백 함수에 로컬 변수를 전달하려면 다음과 같이 작성해야합니다 :

window.setTimeout('updatepcols('+update_argument+')', 250); 

또는 대신 클로저를 사용하려면 다음을 수행하십시오 그래, 등

window.setTimeout(function(){ updatepcols(update_argument) }, 250); 

을 다른 사람들은 클로저를 사용하는 것이 더 나은 방법이라고 말합니다.

+0

기능적이지만 나쁜, 잠재적으로 위험한 실천을 촉진합니다 ... – canon

+0

그것이 내 질문에 대한 직접적인 대답 이었기 때문에 나는 상향했습니다. 그러나 더 나은 방법을 가르치기 때문에 다른 것을 받아 들일 것입니다. – TecBrat

0

당신의 표현 변경이 범위의 문제인지, 그러나 당신의 setTimeout 호출을 변경하는 트릭을해야 할 경우

setTimeout('updatepcols(update_argument)',250); 
관련 문제