2010-02-03 3 views
1

디버깅이 끔찍하며 왜 작동하지 않는 지 혼란 스럽습니다. 여기에 내 상황이있다 :여러 개의 탭을 연 다음 해당 탭에서 작업을 수행하십시오.

필자는 여러 개의 링크를 탭에 연 다음 매우 간단한 조작을 수행하는 함수를 작성했다. 예상했던대로 작동하지 않아 하나의 탭 하나에 하나의 링크 만 열어서 다시 작성했습니다. 이것은 내가 (간체) 한 것입니다 :

links=arrayFromGetElemenetsCall; 
if(condition){ 
    theNewWindow=window.open(links[0]); 
} 
setTimeout("myFunction(theNewWindow)",5000); 
} 

function myFuntion(bob){ 
    bob.doStuff(); 
} 

내가 하나 개 이상의 탭을 열고 내가 오류가 나중에 사용할 수 있도록 배열에 윈도우 참조를 저장하려고하면. 다음은 여러 창에 대한 간단한 코드입니다.

var theArray=new Array(); 
links=arrayFromGetElemenetsCall; 
for(conditions){ 
    if(condition){ 
    theArray[i]=window.open(links[i]); 
    } 
} 
setTimeout("myFunction(theArray[0])",5000);} 

function myFuntion(bob){ 
    bob.doStuff(); 
} 

다음 중 작동하지 않는 코드입니다. 나는 "오류 : theArray가 정의되지 않았다"는 경우에만 setTimeout 함수에 기록됩니다. 나는 전체 배열을 전달한 다음 myFunction에서 루핑하고 bob [0]에서 .doStuff()를 호출하려고 시도했다.

내가 여기에서 볼 수없는 것은 무엇입니까?

답변

2

등이있다. 우선, 문자열을 첫 번째 인수로 전달하는 습관에서 벗어나 setTimeoutsetInterval에 도달하십시오. setTimeout은 암시 적으로 해당 문자열을 실행하기 위해 eval을 사용하고 eval is evil입니다.

이 경우 비밀 평가는 논리적 오류의 원인이기도합니다. 스 니펫은 문제를 정확하게 진단하기에 충분하지 않지만 기본적으로 평가 범위에서는 theArray가 정의되지 않습니다. 클로저를 사용하는 다시 쓰기가 가능한 방법입니다 :

setTimeout(function(obj){ 
    return function(){ 
     myFunction(obj); 
    } 
}(theArray[0]), 5000); 
+0

감사합니다. – baiano

0

당신이하려는 일이 이것입니까? 나는 방화 상자 콘솔에서 이것을 시도하고 2 초 후에 "나는 40"을 출력했다.

var theArray = new Array(); 

for(var i = 0; i < 10; i++) { 
    theArray[i] = i * 10; 
} 

setTimeout("func(theArray[4])", 2000); 

function func(val) { 
    console.log("I have " + val); 
} 
2

(모든 괜찮은 브라우저는 아마도 하나 개 이상의 새 창을 열 수 중지 팝업 차단기가 있습니다.) 당신은을 변경할 수 있습니다

다음 setTimeout("myFunction(theArray[0])",5000);}

로 :

setTimeout(function(){ 
    myFunction(theArray[0]); 
}, 5000); 

그 방법 theArray이 범위에있을 것입니다. setTimeout에 문자열을 전달하면 브라우저에서 window의 범위에서 해당 코드가 실행됩니다.

+0

그랬습니다. 나는 그게 어리석은 단순한 무언가가 될 거라는 것을 알았어. 너는 굉장해. – baiano

관련 문제