2011-02-28 2 views
2

어떻게이 코드는 아래에 쓰여진 것처럼 작동하지 않지만 내가 function testBgChange(){을 주석 처리하고 그 함수 안에 코드를 유지하면 정상적으로 작동합니다. 함수 내에서 코드를 유지 한 다음 해당 함수를 호출하면 어떤 차이가 있습니까? 함수 내에 선언 때함수 외부에서만 작동하는 자바 스크립트 코드 - 이유는 무엇입니까?

<html> 

<head> 

<script type="text/javascript"> 
    testBgChange(); 
    function testBgChange(){ 
     var i = 0; 
     var c = 0; 
     var time = 3000; 
     var incr = 3000; 

     while(i<=3){ 
      if(c==0){ 
       var red = "#FF0000"; 
       setTimeout("changeBgColor(red)",time); 
       time+=incr; 
       c=1; 
      } 
      else if(c==1){ 
       var white = "#FFFFFF"; 
       setTimeout("changeBgColor(white)",time); 
       time+=incr; 
       c=0; 
      } 
     i+=1; 
     } 
    } 

    function changeBgColor(color){ 
     document.getElementById("alert").style.backgroundColor = color; 
    } 


</script> 

</head> 
<body> 
<p id="alert"> 
    <br> 
    <br> 
    Testing 
    <br> 
    <br> 
</p> 
</body> 

</html> 

답변

7

var redvar white 때문에, 단지 함수 내에서 액세스 될 수있다. setTimeout은이 변수에 액세스 할 수없는 전역 범위에서 eval을 호출하므로 문제가됩니다.

이 문제를 해결하는 방법은 다양하지만 setTimeout에 문자열이 아닌 함수를 지정하는 것이 좋습니다.

var red = "#FF00000"; 
setTimeout(function() { 
    changeBgColor(red); 
}, time); 
+0

감사 : 새로운 기능이 포함 된 함수의 변수에 대한 액세스를 유지하는 폐쇄을 생성으로이 문제를 해결할 것입니다! wouldnt는 그것을 알아 냈다 =) – mdc