2012-11-25 3 views

답변

2

"개인"변수가 Javascript에 있다고 생각하는 것 같습니다. 개인 변수는 클로저를 통해 Javascript에서만 에뮬레이트되지만 다른 언어와 마찬가지로 존재하지 않습니다. 코드에서 id은 생성자 내에서만 액세스 할 수 있습니다.

당신은 id 개인 불구하고 여전히 기능 내에서 액세스 할 수 있습니다 유지할 수 있습니다,하지만 당신은 폐쇄가에 액세스하도록 귀하의 생성자에서 그 함수를 선언해야합니다 :

function Example() 
{ 
    //private 
    var id; 

    this.getId = function() 
    { 
     return id; 
    } 

    this.init = function() 
    { 
     $.post('generateId.php', {}, function(data) 
     { 
      id = data; 
     }); 
    }; 
}; 

을 또 다른 문제는 비동기 콜백 내에서 this에 액세스하려고하는 것입니다. 이 컨텍스트 ($.post에 전달 된 콜백)에서 this은 호출 함수의 컨텍스트가 무엇이든 상관 없으며 아마도 정의되지 않았거나 XmlHTTPRequest 개체입니다. 당신이 그것을 액세스하려면

, 당신은 (id 가정하는 것은 개인 아닌, 원래 코드에서) 당신이 함수의 this를 캐시해야합니다 :

Example.prototype.init = function() 
{ 
    var self = this; 
    $.post('generateId.php', {}, function(data) 
    { 
     self.id = data; 
    }); 
}; 
+0

'getId'는'id'가 명시 적으로 설정되어 있지 않으면 undefined를 반환합니다. 그래서 네, 당신이 생성자에서 private로 선언 한 것과 같은 id를 참조하지 않습니다. – tjameson

+0

코드 예제에서 'id'는 생성자를 제외한 모든 곳에서 액세스 할 수 없습니다. 이 문제를 해결하려면 생성자에서 클로저를 작성하면됩니다 (첫 번째 예제). 그러나 생성자 외부에서'id'에 액세스 할 수있는 방법은 없습니다. – tjameson

+0

시간을 내 주셔서 감사합니다. 많은 도움을 받았습니다. –

0

은 어쩌면 당신은 조금을 다시 작성할 수 있습니다 :

var Example = Example || {}; 
Example.id = ""; 

Example.init = function(){ 
$.post('generateId.php', {}, function(data) 
{ 
    Example.id = data; // <-------- error 
}); 
} 
관련 문제