2017-10-10 7 views
-1

에 내가자바 스크립트 코드 익명 함수의 범위

! function(e) { 
    function doSomething() 
    { 
    } 
} 

에 주입 할 필요가 스크립트의이 종류는 기본적으로 내 코드가 함수 객체를 통해이라고 해봐요에 대한 참조를 얻을 수 있지만, 내가 필요있어 주입한다 do something으로 연결하기 위해 id에 대한 원래의 참조가 필요합니다. doSomething은 익명의 함수 안에서 선언되기 때문에 나는 그것에 접근 할 수 없다. 질문은 익명 함수, Greesemonkey 또는 다른 도구의 범위에 코드를 삽입 할 수 있습니까?

+0

때때로 외부 기능이 이미 다른 값을 반환에 필요한

function func(e) { function doSomething() { // ... } // Note that we are not invoking 'doSomething', we are only returning a reference to it. return doSomething; } var doSomething = func(/* some value */); // Now you got the reference! doSomething(); 

를 예를 들면 다음과 같습니다 "주입"이란 무엇을 의미합니까? 특정 페이지에서 JS를 조작하는 userscript/browser 확장 프로그램을 만들려고하십니까? 네, 당신은 당신이 원하는대로 할 수는 있지만, doSomething을 참조 할 때만 변경할 수는 없습니다. – Bergi

+0

예, 필자는 userscript를 작성 중이며 웹 페이지의 일부 기능에 연결하려고합니다. 이를 위해 익명 함수 범위 안에있는 함수에 대한 원래 참조를 변경해야합니다. – user1617735

+0

가장 좋은 방법은 스크립트 로딩을 가로 채고 소스를 변경 한 다음이를 평가하는 것입니다. – Bergi

답변

0

자바 스크립트는 범위 내부에서 값을 쉽게 가져올 수 없습니다. 당신은 더 넓은 범위에 doSomething를 선언 할 수

:

function doSomething() { 
    // ... 
} 
function func(e) { 
    doSomething(); // This works! `func` has a reference to `doSomething` 
} 

doSomething(); // This also works! `doSomething` is declared in this scope. 

또한 내부 범위에서 값을 반환 할 수 있습니다! 우리는 여전히 원래의 값과 함께, doSomething을 반환 할 수 있습니다이 경우

function func(e) { 
    function doSomething() { /* ... */ } 
    return 'important value!!'; 
} 

:

function func(e) { 
    function doSomething() { /* ... */ } 
    return { 
     value: 'important value', 
     doSomething: doSomething 
    }; 
} 

var funcResult = func(/* some value */); 
var originalValue = funcResult.value; 
var doSomething = funcResult.doSomething; 

// Now we have the original value, AND we have access to `doSomething`: 
doSomething(); // This works 
+0

글쎄, 그 범위 내에서 함수에 후크를해야합니다. 즉, 그 범위 내에서 여러 다른 함수에 의해 호출되었으므로 해당 함수에 대한 원래 참조를 수정해야합니다. 전역 함수로 오버라이드하면, 지금은 내 함수를 호출하는 모든 함수를 구현할 것입니다.하지만 여전히 연결해야하는 원래 함수를 호출해야합니다. – user1617735

+0

나열된 다른 방법은 어떻게됩니까? 반환 값에'doSomething'을 포함하기 만하면됩니까? –

+0

내부 범위에 액세스 할 수 없으므로 전체적인 문제입니다. – user1617735