2013-09-07 2 views
2

"private 필드"를 외부 세계로 반환 할 때 드러난 모듈 패턴으로 인해 매우 혼란 스럽습니다. 나는 결과에 의해 혼란스러워했다자바 스크립트 공개 모듈, private 필드 반환

var vm2 = (function(){ 
    var 
     name = 'sean', 
     changename = function(v){ 
      this.name=v; 
     }; 

    return { 
     name: name, 
     foo: name, 
     changename:changename 
    }; 
}()); 

vm2.changename('jasper'); 
console.log(vm2.name); 
console.log(vm2.foo); 

여기 는 vm2.name는 '재스퍼'vm2.foo 여전히 '숀'동안, 누군가가 내가 그것을 이해하는 데 도움이이며, 코드인가?

+0

왜 "foo"가 변경 될 것이라고 생각하십니까? – Pointy

+0

@Pointy 네, "this", "name"foo가 가리키는 "name"changename이 바뀌지 않았습니다. 응답이 정확합니다. 다시 감사합니다. – Sean

답변

1

"changename"함수는 객체의 "name"속성 만 업데이트합니다. 그것은 클로저에있는 "name"이라는 로컬 변수를 엉망으로 만들지 않으며 "foo"를 엉망으로 만들지 않습니다. 따라서 객체의 "foo"속성은 "changename"에 전달하는 것과 상관없이 초기 값을 유지합니다.

그래서 단계별로 :

  1. 변수 "VM2"

    는 익명 함수에 의해 초기화됩니다. 값은 세 가지 속성을 가진 객체입니다.
  2. "changename"기능 호출은 "vm2"의 속성 참조를 통해 이루어집니다. 그러면 this이 "changename"이 실행되는 동안 해당 오브젝트에 바인드됩니다.
  3. "changename"안에는 this ("vm2"개체)으로 참조되는 개체의 "name"속성이 매개 변수로 전달되는 값으로 업데이트됩니다. 한 번 "VM2"이 초기화

참고, 그 코드에 아무것도 "foo는"접촉하지 않는다.

+0

우수 답변! 당신이 맞습니다, 나는 changename이 호출 할 때 "this"에 속았습니다. this.name은 "개인 이름"이 아니므로 변경하면 vm2의 name 속성이 직접 변경됩니다. – Sean

0

이 사례는 어떻습니까? 왜 그 사람은 여전히 ​​사적인 사람입니까?

var vm = (function() { 
     var person = { name: "jasper" }; 
     var changename = function (v) { 
      //person.name = v; 
      person = { }; 
     }; 

     return { 
      person: person, 
      changename: changename 
     }; 
    })(); 

    vm.changename("sean"); 
    alert(vm.person.name);