2013-03-02 7 views
0

일부 사이트에 대해 userscript을 쓰고 있습니다. 함수에서 내부 변수에 액세스해야합니다. 예를 들어, 코드를 다음에 내가 사이트의 코드를 변경할 수 없습니다JavaScript의 내부 변수에 액세스

function a(){ 
    var b; 
    //assignment to b and other stuff 
}; 
var c=new a(); 

c를 객체의 b를 "개인 재산"에 접근 할 필요가, 난 단지 BORWSER 확장 SCRIPTISH을 변경하고 USERSCRIPT를 작성할 수 있습니다. 내 브라우저가 최신 파이어 폭스입니다. Scriptish을 변경해야하더라도 액세스 권한이 필요합니다.

+4

직접 할 수없고'b'를'this'의 속성으로 지정하면'c'의 속성이됩니다. 그 중 하나, 또는'b'의 값을 반환하는 메소드/함수를 첨부하십시오. (당신은 생성자 함수에서 그 함수를 생성해야 할 것이고, 프로토 타입 메소드에서도 사용할 수 없을 것입니다.) –

+0

클로저가이 상황에서 도움이 될 것이라고 생각합니까? 나는 틀릴 수 있었다. – aug

+0

코드는 제 것이 아니지만 userscript와 Scriptish 만 사용하여 코드를 변경해야합니다. 나는 세계화를 할 수 없으며, 의도적으로 로컬 스크립트로 작성하여 사용자 스크립트 작성을 방지했습니다. 한 번 더 : 나는 USERSCRIPT를 쓰고 있습니다. 피들러 사용 및 스크립팅 엔진은 좋은 해결책이 아닙니다. – KOLANICH

답변

1

함수의 내부 변수에 액세스 할 수 없으므로 외부 변수를 가져 오려면 전역 변수로 지정해야합니다. 코드 b 1.

+1

아니요. 질문에서 b 내부 함수는 로컬입니다. 글로벌 고객 만 변경하고 있습니다. 'b = 1;'줄을'var b = 1'로 변경하고 다시 테스트하십시오. – Hogan

0

var b; 
function a(){ 
b=1; 
    //assignment to b and other stuff 
}; 
var c=new a(); 
document.write(c.b); 

및 출력이 될 것입니다 개인 변수지만, 지역 변수가 아닙니다. var c=new a();b 실행 후 더 이상 존재하지 않습니다. 따라서 액세스 할 수 없습니다. b 여전히 지역 변수입니다 여기에

function a(){ 
    var b; 
    //assignment to b and other stuff 
    this.revealB = function() { 
     return b; 
    } 
}; 
var c = new a(); 
alert(c.revealB()); 

을, 그러나 그것의 수명은 폐쇄에 의해 영향을 받는다, 우리는 revealB를 호출 할 때, 따라서 여전히 살아있다 : ​​당신이 closures를 사용하는 경우

는하지만, 모든 변경됩니다.

+0

OP의 원래 게시물에 revealB 기능이 없습니다. 코드를 변경할 수 없습니다. – Hogan

0

이 할 수있는 매우 간단한 일이며, 상속 애플리케이션을 위해 중대하다 :

당신은 단순히 당신이 원하는대로 돌아가 어쩌면 방법을 통해 그것을 반환, 나중에 다른 기능에서 그것을 다시 그 위에 구축.

예는 다음과 같습니다

function a(){ 
     var b; 
     //assignment to b and other stuff 
     return b; 
     }; 

    // or 

    function a(){ 
     var b, result; 
     //assignment to b and other stuff 
     returnInitial: function() { 
      return b; 
     } 
     // other stuff with b 
     return result; 
    }; 

나중에 그렇게 '기생 상속'과 같은 새로운 방법을 모든 로컬 변수를 사용하여 추가 다른 함수 내에서이 모든 기능을 시작할이라는 사용할 수 있습니다

var a function() { 
     var b, result; 
     //assignment to b and other stuff 
     returnInitial: function() { 
      return b; 
     } 
     // other stuff with b 
     return result; 
} 
var extendedA function() { 
    var base = new a; 
    var b = a.returnInitial(); 
    a.addToB = function (c) { 
    var sum = c + a.returnInitial(); 
    return sum; 
    } 
} 

이제받을 수 있습니다

var smt = new extendA(); 
var c = 12; //some number 
var sumBC = extendA.addToB(c); 

i, jou 객체 처리에 대한 doug crockford 강의에 대한 yutube 검색을 권장합니다.

새로운 인스턴스를 초기화하지 않으면 자바 스크립트에서 사용하는 동적 객체 처리 이후에 새 객체를 사용해야하므로 원래 객체가 손상 될 수 있습니다.

+0

이것은 작동하지 않습니다. OP 질문에 b를 반환하는 함수가 없습니다. – Hogan

관련 문제