2011-05-09 2 views
1

이 JS 코드 조각에는 private 함수 (bar 및 bar2)의 두 가지 버전이있는 개체가 있습니다. 나는 두 개의 인스턴스를 선언하지만 private 함수 (bar)의 한 버전이 다른 객체의 private var v 값에 잘못 액세스하고있는 것처럼 보입니다. 아무도 왜 이것이라고 말해 줄 수 있니?JS : 개인 함수 선언 방법의 효과 차이점

Eric = function(_v) 
{ 
    var v = _v; 

    bar = function() { 
     alert(v); 
    }; 

    function bar2() { 
     alert(v); 
    }; 

    this.foo = function() { 
     bar(); 
    }; 

    this.foo2 = function() { 
     bar2(); 
    }; 
}; 

var e = new Eric('I am Eric'); 
var e2 = new Eric('I am Eric II'); 

e2.foo(); // outputs "I am Eric II" 
e.foo(); // outputs "I am Eric II" ------ WHY? 

e2.foo2(); // outputs "I am Eric II" 
e.foo2(); // outputs "I am Eric" 

많은 감사 앤드류

답변

5
bar = function() { 
    alert(v); 
}; 

당신은 bar 글로벌했습니다. 이 bar이 지역 있도록 var bar = ...를 사용하여 전화 e2 = new Eric("I am Eric II");

수정이에 정의 된 두 번째 줄 기능이 있음을 의미합니다.

별도의 메모로 var Eric을 잊어 버렸습니다.

생성자 인수 _v이 범위에 있으므로 로컬로 var v을 선언 할 필요가 없습니다. 그 인수를 대신 사용해도됩니다.

+0

+1 내 솔루션보다 우수하므로 – Tejs

+0

아, 알겠습니다! 나는 바가 에릭 내부에서 선언 되었기 때문에 그것이 잘못되었다고 생각했다. 감사합니다, Raynos, 그 (그리고 내 다른 오류! :-)) – andrewk

+0

바가 글로벌이기 때문에, 나는 왜, 왜 개인적인 변수 v. – andrewk

0

두 번째 호출로 개체에 막대가 재정의되고 있기 때문입니다. 이 스위치로 전환하면 작동합니다 :

this.bar = function() {} 

물론 원하는 개인 기능이 중단됩니다. bar은 Eric 인스턴스의 로컬 심볼이 아닙니다.