2012-04-14 2 views
1

범위 문제는 함수 문이 항상 현재 컨텍스트의 맨 위에 올랐다 고 생각합니다. 그럼 왜 'hideNav()'가 다음에서 정의되지 않습니까?자바에서 setTimeout으로 범위 문제가 발생했습니다.

var t; 


function showNav(bflag){ 
clearTimeout(t); 
if(bflag===true){ 
    $("#tS2").stop(false,false).animate({ 
       'bottom':'0' 
      }, 1000); 
}else{ 

    t=setTimeout("hideNav()",1000); 

} 
} 

function hideNav(){ 
$("#tS2").stop(true,false).animate({ 
       'bottom':'-125px' 
      }, 1000); 
} 

답변

6

변경,

setTimeout("hideNav()",1000); 

setTimeout(hideNav, 1000); 

hideNav

에은 현재 컨텍스트에 정의되어 있지만 setTimeout에 문자열을 전달하고 있습니다. 해당 문자열은 전역 개체의 컨텍스트에서 시간 초과가 발생할 때 평가됩니다. hideNav 함수가 전역 개체에 정의되어 있지 않으므로 예외가 발생합니다.

함수에 대한 참조를 setTimeout에 직접 전달하면 걱정할 필요가 없습니다.

2

이 경우 setTimeout() 인 문자열을 사용하지 마십시오. 에

변경을 : 그것은 eval()를 사용하는 setTimeout() 힘을 가진 문자열을 사용

t = setTimeout(hideNav, 1000); 

은 문자열을 평가하고 있다고하면, 그것은 글로벌 컨텍스트가 아닌 해당 지역의 컨텍스트를 사용합니다. 그래서, 내 추측에 따르면 hideNav()은 실제로 전역 함수가 아닙니다 (아마도이 ​​코드는 다른 함수로 래핑되었습니다).

게다가 문자열이 아닌 직접 함수 참조를 사용하는 것이 더 빠릅니다. 직접 함수 참조를 사용할 때는 나중에 괄호를 넣지 마십시오. 함수에 대한 참조를 원한다면 즉시 실행하고 반환 값을 전달하는 것은 바람직하지 않습니다. 사용하면 반환 값을 전달합니다. t = setTimeout(hideNav(), 1000);

관련 문제