2011-09-11 3 views
6

코드로 설명하는 것이 가장 쉬운 방법 : 예상대로노드 모듈 - 변수를 반출하는 것과 반출하는 함수를 반출하는 모듈?

##### module.js 
var count, incCount, setCount, showCount; 
count = 0; 

showCount = function() { 
return console.log(count); 
}; 
incCount = function() { 
    return count++; 
}; 
setCount = function(c) { 
    return count = c; 
}; 

exports.showCount = showCount; 
exports.incCount = incCount; 
exports.setCount = setCount; 
exports.count = count; // let's also export the count variable itself 

#### test.js 
var m; 
m = require("./module.js"); 
m.setCount(10); 
m.showCount(); // outputs 10 
m.incCount(); 
m.showCount(); // outputs 11 
console.log(m.count); // outputs 0 

보낸 기능은 작동합니다. m.count도 11

답변

13

exports.count = count

귀하가 count의 값으로 객체 exports에 속성 count을 설정하지 않는 이유하지만 난 분명하지 않다. 나는. 0.

모든 것이 값으로 전달되지만 참조로 전달되지 않습니다.

당신은 같은 같은 게터로 count를 정의한다면 :

Object.defineProperty(exports, "count", { 
    get: function() { return count; } 
}); 

이, 그리고 exports.count 항상 count의 현재 값을 반환하고, 따라서 만약 내가 잘못 11

+2

모든 것이 가치에 지나지 않습니다! 함수와 객체는 항상 참조로 전달됩니다. – zetlen

+2

@zetlen 아니요 값으로 전달됩니다. 그들이 전달하는 값은 객체에 대한 참조입니다. 참조에 의한 전달은 포인터입니다. 포인터가 없습니다 – Raynos

0

나를 정확하지만, 숫자 변경할 수없는 유형입니다. count 값을 변경하면 참조도 변경됩니다. 따라서 exports.count은 이전 count 값을 참조합니다.

0

JavaScript에서는 기능 및 객체 (배열 포함)가 참조로 변수에 할당되고 문자열과 숫자는 값으로 (즉, 사본을 만들어서) 할당됩니다. var a = 1var b = ab++ 경우, a 여전히이 행에서 1

동일합니다 :

exports.count = count; // let's also export the count variable itself 

당신이 카운트 변수의 값에 의한 복사했다. setCount(), incCount() 및 showCount() 작업은 모두 클로저 내부의 count 변수에서 작동하므로 m.count가 다시 처리되지 않습니다. 이러한 변수가 this.count에서 작동 중이면 기대하는 동작을 얻습니다.하지만 어쨌든 count 변수를 내 보내지 않으려 고합니다.

+0

"참조로"는 포인터를 의미합니다. 우리가 자바 스크립트에서 가지고있는 포인터는 어디에 있습니까? – Raynos

+1

충분합니다. 객체 할당/함수 할당과 문자열 할당의 차이점을 설명하기 위해 무엇을 사용 하시겠습니까? 아니요, 문자 그대로의 메모리 위치는 아닙니다. 그러나 객체에 대한 두 개의 참조는 동일한 객체를 수정하거나 표시 할 것이고, 이는 문자열에 해당하지 않습니다. 그걸 뭐라고 부르니? – zetlen

+1

@zetlen,이 기사는 https://developer.mozilla.org/en-US/docs/Talk:JavaScript/Guide/Obsolete_Pages/Defining_Functions에 질문에 간단히 대답합니다. 본질적으로 모든 JavaScript 함수는 값별로 전달됩니다. 흥미로운 질문은 그들이 어떤 가치를 전달 하는가하는 것입니다. 기본 유형의 경우 데이터 자체이며 기본 유형이 아닌 경우 유형은 엔터티의 로컬입니다. – Thierry

관련 문제