English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
require는 코드를 로드하는 데 사용되며, exports와 module.exports는 코드를 내보내는 데 사용됩니다. 하지만 많은 초보자들이 exports와 module.exports의 차이에 대해 혼란스러울 수 있습니다. exports와 module.exports의 관계를 더 잘 이해하기 위해, 먼저 js의 기본을 강화해야 합니다. 예제:
app.js
var a = {name: 'nswbmw 1} var b = a; console.log(a); console.log(b); b.name = 'nswbmw 2; console.log(a); console.log(b); var b = {name: 'nswbmw 3} console.log(a); console.log(b);
app.js 실행 결과:
{ name: 'nswbmw 1} { name: 'nswbmw 1} { name: 'nswbmw 2} { name: 'nswbmw 2} { name: 'nswbmw 2} { name: 'nswbmw 3}
이해해 주세요:a는 객체이고, b는 a에 대한 참조입니다. 즉, a와 b는 동일한 객체를 가리키며, 동일한 메모리 주소를 가리킵니다. 따라서 앞 두 개의 출력이 같습니다. b에 대한 변경을 시행할 때, 즉 a와 b가 가리키는 메모리 주소의 내용이 변경되면, a도 그 변경을 반영합니다. 따라서 세 번째와 네 번째 출력이 같습니다. b를 완전히 덮어씌울 때, b는 새로운 메모리 주소를 가리키게 됩니다(원래의 메모리 블록을 변경하지 않습니다). a는 여전히 원래의 메모리 블록을 가리킵니다. 따라서 a와 b는 더 이상 동일한 메모리 블록을 가리키지 않습니다. 즉, 이때 a와 b는 서로 관계가 없습니다. 따라서 마지막 두 개의 출력이 다릅니다.
위의 예제를 이해한 후, 주제에 돌아가겠습니다.
exports와 module.exports의 차이를 알기 위해 필요한 세 가지를 알면 됩니다:
따라서: 우리는
var name = 'nswbmw'; exports.name = name; exports.sayName = function() { console.log(name); }
exports에 값을 할당하는 것은 실제로는 module.exports 이라는 빈 객체에 두 개의 속성을 추가하는 것에 불과합니다. 위의 코드는 다음과 같습니다:
var name = 'nswbmw'; module.exports.name = name; module.exports.sayName = function() { console.log(name); }
우리는 일반적으로 exports와 module.exports를 이렇게 사용합니다
원형 면적을 계산하는 간단한 예제:
exports 사용
app.js
var circle = require('./circle'); console.log(circle.area(4))를 호출합니다;
circle.js
exports.area = function(r) { return r * r * Math.PI; }
module.exports 사용
app.js
var area = require('./area'); console.log(area(4))를 호출합니다;
area.js
module.exports = function(r) { return r * r * Math.PI; }
위 두 예제의 출력은 같습니다. 그렇다면 왜 이렇게 작성하지 않을까요?
app.js
var area = require('./area'); console.log(area(4))를 호출합니다;
area.js
exports = function(r) { return r * r * Math.PI; }
위의 예제를 실행하면 오류가 발생합니다. 이는 이전 예제에서 exports에 속성을 추가하여 exports가 가리키는 메모리를 수정했을 뿐만 아니라
exports = function(r) { return r * r * Math.PI; }
실제로는 exports에 대한 덮어쓰기가 이루어졌습니다. 즉, exports는 새로운 메모리(원형 면적 계산 함수로 구성)를 가리키게 되었으며, 따라서 exports와 module.exports는 같은 메모리를 가리키지 않습니다. 즉, 이때 exports와 module.exports는 서로와 어떤 연결도 없으며, 즉 module.exports가 가리키는 메모리는 어떠한 변경도 받지 않았으며 여전히 빈 객체 {}입니다. 즉, area.js는 빈 객체를 내보내었기 때문에, 우리는 app.js에서 area를 호출할 때4오류: TypeError: object is not a function이 발생합니다.
따라서, 간단히 요약하면: 모듈이 출력하는 것이 객체일 때, exports와 module.exports 모두 사용할 수 있습니다(하지만 exports는 새로운 객체로 덮어쓰지 않을 수 없습니다), 그리고 비 객체 인터페이스를 출력하려고 할 때는 반드시 module.exports를 덮어쓰고만 사용할 수 있습니다.
우리는 자주 이러한 문법을 볼 수 있습니다:
exports = module.exports = somethings;
위의 코드는 다음과 동일합니다:
module.exports = somethings; exports = module.exports;
이유는 매우 간단합니다. module.exports = somethings는 module.exports를 덮어쓰는 것입니다. 이 때 module.exports와 exports의 관계가 끊어지고, module.exports는 새로운 메모리 블록을 가리키게 되었으며, exports는 여전히 원래의 메모리 블록을 가리키고 있습니다. 이를 통해 module.exports와 exports가 여전히 같은 메모리 블록을 가리키거나 같은 “객체”를 가리키도록 하기 위해 exports = module.exports를 사용합니다.
이상이 본 문서의 전부입니다. 본 문서의 내용이 여러분의 학습이나 업무에 도움이 되길 바랍니다. 또한, 외침 강의에 많은 지지를 부탁드립니다!
고지: 본 문서의 내용은 인터넷에서 가져왔으며, 저작권은 원 저작자에게 있으며, 인터넷 사용자가 자발적으로 기여하고 업로드한 내용으로, 본 웹사이트는 소유권을 가지지 않으며, 인공 편집을 하지 않았으며, 관련 법적 책임도 부담하지 않습니다. 저작권 침해가 의심되는 내용이 있으면 notice#w로 이메일을 보내 주세요.3codebox.com에 이메일을 보내시면 (#을 @으로 변경해 주세요) 신고를 하고 관련 증거를 제공하시면, 해당 저작권 침해 내용이 확인되면 즉시 삭제됩니다.