2012-11-09 3 views
-1

스코프 체인이 첫 번째 "테스트 = 새 테스트();" 작동하지만, 그렇지 않습니다. 왜?JS - 스코프 체인

var tool = new Tool(); 
tool.init(); 

function Tool(){ 
    var test; 

    function init(){ 
     //does not work, undefined 
     test = new Test(); 

     //does work 
     this.test=new Test(); 

     console.log(test); 
    } 
} 

function Test(){ 
} 

편집 : 내 말 작동하지함으로써, 테스트 그것은 간단

+0

그것은해야한다 : 당신이 도구의 인스턴스를 많이하고 있다면 그런데

, 당신의 코드가 더 많은 메모리를 효율적입니다 그래서 같은 대신 함수를 정의하는 도구의 프로토 타입을 사용하는 기억 . 질문은, 당신은 무엇을하려고합니까? 귀하의 코드는 아무런 의미가 없습니다. – iMoses

+3

정확히 무슨 일이 일어나고 있는지에 대한 충분한 코드가 없습니다. 'init'은 어떻게 불려지나요? 'test'에 어떻게 접근하려고합니까? – josh3736

+0

"직장"이란 무엇입니까? –

답변

2

'정의되지 않은'것을 말한다. Tool 인스턴스에 init 메소드가 없습니다. 코드에서 init 함수는 Tool 생성자의 로컬 함수에 불과합니다. Tool 인스턴스는 이러한 함수를 상속하지 않습니다.

당신의 Tool 인스턴스가 init 방법을 가지고 당신이 원하는 경우에, 당신은 할 수 있습니다

  1. 생성자 내부의 방법으로 지정 :

    function Tool() { 
        this.init = function() { ... }; 
    } 
    
  2. 또는 외부 (Tool.prototype에 할당) :

    Tool.prototype.init = function() { ... }; 
    

모든 인스턴스가 동일한 init 기능을 공유하므로 두 번째 옵션이 더 잘 수행됩니다. 첫 번째 옵션에서 각 인스턴스는 생성자 호출 중에 만들어진 함수를 가져옵니다.

+0

분명히 그의 예제 코드에 문제가있는 것은 사실이지만, init 내에서 varriables에 관한 문제라고 생각하며 잘못된 함수 정의를 간과했다. – DSKrepps

1

Tool 범위 또는 반환 된 객체에서 test에 액세스하려고합니까? 그것들은 두 개의 다른 변수입니다. testB 공공 동안,

var tool = new Tool(); 

function Tool(){ 
    var testA; // Private 

    this.init = function(){ 
     testA = 1; 

     this.testB = 9; // Public 
    } 

    this.getTestA = function(){ // Public method to access the private testA 
     return testA; 
    } 

} 

tool.init(); 

console.log(tool.getTestA()); // 1 
console.log(tool.testB); // 9 

testA이 도구의 방법을 통해서만 액세스, 개인 변수로 알려져있다 : 나는 그들에게 A와 B를 표시했습니다.

찾고 계신 것이 있습니까?

function Tool(){ 
    var testA; 
} 
Tool.prototype.init = function(){ 
    testA = 1; 
    this.testB = 9; 
} 
Tool.prototype.getTestA = function(){ return testA; }