2012-10-18 4 views
1

클로저를 오버라이드하여 원래 클로저의 일부분을 수행 할 수있는 방법이 있습니까? 나는 직접적인 방법이 없다는 것을 알고 있지만, 해킹이 있습니까? 난 당신 스크립트 태그의 내용을 얻기 위해 jQuery를 사용할 수 있다고 생각javascript : 클로저 범위 내의 함수를 호출

<html> 
    <head> 

     // I DON'T CONTROL THIS CODE!!! 
     <script> 
     ;(function() { 

      function _dothing() { 
       alert("_dothing"); 
      } 

      function _doit() { 
       _dothing(); 
       alert("_doit"); 
      } 

      window.K = { doit : _doit }; 

     })(); 
     </script> 
    </head> 
<body> 

    // I DO CONTROL THIS CODE 
    <script> 

     function mydoit() { 
      alert("mydoit"); 
      _dothing();   <-- THIS FAILS, IS THERE ANY WAY TO SUCCEED? :(
     } 

     window.K.doit = mydoit; 
     window.K.doit(); 
    </script> 

</body> 
</html> 
+0

나는 당신의 범위에서 그것을 본다. 나는 복사 & 붙여 넣기, 그 옵션이 무엇입니까? – Trylks

+0

불행히도 아니오 : 다른 이유 때문에 _dothing()을 복제 할 수 없습니다 (재현 할 수없는 마법 같은 척하면서). 그리고 맨 위의 스크립트 본문을 만질 수 없습니다. – Colin

+0

번호 폐쇄 범위는 변경할 수없는 * 선언 * 함수의 위치에서옵니다. – Bergi

답변

1

... 지저분 할 기꺼이 그 후에 당신은 evalquestion을 볼 수 있습니다.

+0

네, 범위 밖에 존재하므로 접근 할 수있는 유일한 방법은 스크립트를 구문 분석하고 eval을 사용하는 것입니다. –

1

은이 안에 코드를 삽입 할 때 :

그것은 자기 호출 함수를 호출하고있어
(function() { 

})(); 

는 범위를 만듭니다 할 수 있습니다 (다만 다른 곳에서는 함수의 범위를 액세스 할 수없는 마음에 들지 액세스 .. 그것의 내부 만) - 그것이 선언되자 마자 실행됩니다. window.K.doit으로 전화 할 수 있다는 사실은 코드가이고 글로벌 코드window 개체이기 때문에 가능합니다. 어디서나 window에 액세스 할 수 있기 때문에 전화 할 수는 있지만 window.K.doit 또는 K.doit으로 만 호출 할 수 있습니다. 이것은 jQuery 플러그인이 일반적으로 정의되는 방식입니다. 즉, 코드를 직접 노출시키지 않고 전역 jQuery 오브젝트를 확장합니다. Sooooo 아니, 당신은 다른 답변자가 제안하는 것과 같은 것을하지 않으면 접근 할 수 없다. 그러나 eval을주의해서 사용하면 어떤 스크립트라도 삽입 될 수 있고, 당신이 옳고/신뢰할 수 있고 평가한다고 가정 할 수있다.

+0

Doh. 불행히도 나는 평가 절하를 할 수 있다고 생각하지 않는다. 첫 번째 코드 블록 (실제로 제어 할 수없는 코드 블록)은 실제로 iOS의 UIWebView에 stringByEvaluatingJavascriptFromString을 사용하여 '삽입'됩니다. 그래서 저는 그 맥락이 어디에 있는지조차 모릅니다. 내가 엉덩이 같아요 : ( – Colin

+0

하지만 주사를 맞고 자바 스크립트를 읽을 때까지 기다릴 수 없습니까? 아니면 주입되었을 때 이미 평가 되었습니까? – dignifiedquire

1

이 같은 것을 (나는 다른 사람,이 매우 불쾌한 알고 있지만 시도 할 수 있습니다 그것은 유일한 방법 인 것 같습니다 :

function mydoit() { 
    alert("mydoit"); 
    _dothing(); 
} 

var f = new Function(document.scripts[0].text.replace(/(}\)\(\);\s*)$/, "window._dothing = _dothing;\n$1")); 
f(); 
window.K.doit = mydoit; 
window.K.doit(); 

Firefox, Chrome 및 IE8에서 테스트되었습니다.

주의 : 이것은 새로운 컨텍스트의 구멍을 만드는 것입니다. 이미 만들어진 컨텍스트와 다릅니다. 원본은 아니고 _dothing의 복사본입니다.

+0

대단히 고의적인데 실제로 작동 할 수도 있습니다! 실제 사용 사례를 좀 더 복잡하게하여 테스트 해보십시오. – Colin

관련 문제