2014-02-05 2 views
0

내 질문에 정확하게 해당 스레드에서이 일 Javascript revealing module pattern, public properties자바 스크립트 계시 모듈 패턴과 변수

과 동일, 대답이 주어졌다가 아니라 "왜". . 여기에 내 자신의 예제를 재 작성 같은 질문 :이 시나리오에서는

myApp.User = function() { 
    var firstName = 'Default', 
     lastName = 'Default'; 

    function setFirstName(name) { 
     firstName = name; 
    } 

    function setLastName(name) { 
     lastName = name; 
    } 

    function getFirstName() { 
     return firstName; 
    } 

    function getLastName() { 
     return lastName; 
    } 

    return { 
     getLastName: getLastName, 
     **getFirstName: getFirstName**, 
     setLastName: setLastName, 
     setFirstName: firstName 
    }; 
}; 

는, 사용자() getFirstName는 항상에 "기본"evals - 나는 setFirstName 기능을 통해 다른 값으로 변경할 경우에도 마찬가지입니다. 내가 좋아하는 setFirstName로 교체 할 경우

:

return { 
    getLastName: getLastName, 
    **getFirstName: getFirstName**, 
    setLastName: setLastName, 
    setFirstName: firstName 
}; 

나는 변경된 값에 액세스 할 수있게되었습니다. var firstName은 값에 의해 전달되므로 업데이트 된 값이 반영되지 않습니다. 나는이 기능에 대해 특별한 것이 무엇인지 이해하지 못한다. 함수 내에서 값에 대한 포인터는 어디에 있습니까? 왜 모든 기능이 "마술처럼"업데이트에 액세스 할 수 있습니까?

+2

후 " '기본'항상 evals는"당신이 * 동일한 개체에 처음으로'setFirstName'를 호출하지 않는 경우 *. 게다가,'{setFirstName : firstName}'은'obj.setFirstName' *이 함수가 아니라 (firstName'은 함수가 아니기 때문에) 당신이 원한다고해도 호출 할 수 없다는 것을 의미합니다. (코드는 firstName 변수를 변경하지 않기 때문에 * 항상 'Default'가됩니다.) – user2864740

+1

[JavaScript 클로저는 어떻게 작동합니까?] (http://stackoverflow.com/questions/111102) 중복 가능성이 있습니다./how-do-javascript-closures-work) – Philipp

+0

반환 된 객체의 마지막 속성이'setFirstName : firstname'보다는'setFirstName : setFirstName'일까요? –

답변

0

함수 내의 값을 가리키는 포인터는 어디에 있습니까?

범위 내에서에는 액세스 할 수있는 모든 변수가 들어 있습니다. 이 액세스를 통해 실제로 함수는 closure이됩니다.

모든 기능이 "마법처럼"업데이트에 액세스하는 이유는 무엇입니까?

모든 기능이 이므로 변수가 상위 범위에 선언되었습니다.

+0

이것이 나의 질문의 심혼에 도착하기 때문에 정확한 것과 같이 표를하는. 기본적으로 나는 클로저를 이해하지 못해 행동이 기괴한 것처럼 보였다. – user1821052

0

그들은 "마술처럼"업데이트에 액세스하지 않습니다. 그들은 안에 있으며 myApp.User 안에 있기 때문에 변수 위치에 액세스 할 수 있습니다.

myApp.User().getFirstName()을 수행하면 getFirstName이 함수 (범위) 안에 있으므로이 함수와이 함수 외부에서 선언 된 변수에 액세스 할 수 있습니다. 위의 예에서

function a(){ 
    var b = "hello"; 
    return { 
     setB: function(c){ b = c; }, 
     getB: function(){ return b; } 
    }; 
} 

var obj = new a(); 
obj.getB();   //hello 
obj.setB("new"); 
obj.getB();   //new 

getBsetB 모두 개체 안에 살고, 그들은 a() 범위 내에서 모든 변수에 액세스 할 수 있습니다.

setFirstName: firstName 

setFirstName 첫 번째 예 여기에 무슨 짓을했는지에

0

보기는 기능 "setFirstName"을 참조 아니라 변수가 'firstName을'... 당신은에 액세스 할 수없는 아닙니다 함수 'setFirstName'. 이 기능은 여전히 ​​사용할 수 없으므로 원하는대로 첫 번째 이름을 수정할 수 없습니다.

범위를 벗어났습니다. 반환하지 않았으므로 외부 세계에서 사용할 수 있습니다. 그것은 기능 범위의 "외부"에서 사용할 수 없습니다. 아래 그림과 같이 function()을 반환하고 "setFirstName"을 적용합니다.

시도해주세요.

myApp.User = function() { 
    var firstName = 'Default', 
     lastName = 'Default'; 

    function setFirstName(name) { 
     firstName = name; 
    } 

    function setLastName(name) { 
     lastName = name; 
    } 

    function getFirstName() { 
     return firstName; 
    } 

    function getLastName() { 
     return lastName; 
    } 

    return { 
     getLastName: getLastName, 
     getFirstName: getFirstName, 
     setLastName: setLastName, 
     setFirstName: setFirstName 
    }; 
}(); 
myApp.User.setFirstName('bill'); 
myApp.User.getFirstName(); 
0
var User = function() { 
    var firstName = 'Default', 
     lastName = 'Default'; 

    return { 
     getLastName: function() { return lastName; }, 
     getFirstName: function() { return firstName; }, 
     setLastName: function(name) { lastName = name; }, 
     setFirstName: function(name) { firstName = name; }, 
     getName:  function() { return firstName + ' ' + lastName; } 
    }; 
}; 

var u = User(), 
    v = User(); 
console.log(u.getName() + ' - ' + v.getName()); 
// Outputs: 'Default Default - Default Default' 
u.setFirstName('Alice'); 
u.setLastName('Bob'); 
console.log(u.getName() + ' - ' + v.getName()); 
// Outputs: 'Alice Bob - Default Default' 
관련 문제