예제 1 모듈 정의
const BitSet = (function() {
// 비공개 함수 및 상수
function isValid(set, n) { ... }
function has(set, byte, bit) { ... }
const BITS = new Uint8Array([1,2,4,8,16,32,64,128]);
const MASKS = new Uint8Array([~1,~2,~4,~8,~16,~32,~64,~128]);
// 모듈의 공개 API는 여기서 정의하고 반환하는 BitSet 클래스 뿐임
// 위에서 정의한 비공개 함수와 상수는 BitSet 클래스만 사용 가능
// 클래스 사용자에게는 보이지 않음
return class BitSet extends AbstractWritableSet {
// 생략
};
}());
예제 2 정의한 모듈을 사용하는 법
const stats = (function() {
// 모듈에서만 사용하는 비공개 유틸리티 함수
const sum = (x,y) => x+y;
const square = x => x * x;
// 내보낼 공개 함수
function mean(data) {
return data.reduce(sum)/data.length;
}
// 내보낼 공개 함수 2
function stddev(data) {
let m = mean(data);
return Math.sqrt(
data.map(x => x - m).map(square).reduce(sum)/data.length-1);
);
}
// 공개 함수를 객체 프로퍼티로 내보냄
return {mean, stddev};
}());
// 모듈은 다음과 같이 사용
stats.mean([1,3,5,7,9]) // 5
stats.stddev([1,3,5,7,9]) // Math.sqrt(10)
const modules = {};
function require(moduleName) {return modules[moduleName];}
modules["sets.js"] = (function() {
const exports = {};
// set.js 파일 내용이 여기 들어감
exports.BitSet = class BitSet { ... };
return exports;
}());
modules["stats.js"] = (function() {
const exports = {};
const square = x => x*x;
exports.mean = function(data) { ... };
exports.stddev = function(data) { ... };
return exports;
}());
// 필요한 모듈 또는 그 콘텐츠 참조를 가져옴
const stats = require("stats.js");
const BitSet = require("sets.js").BitSet;
// 모듈을 사용하는 코드를 작성
let s = new BitSet(100);
s.insert(10);
s.insert(20);
s.insert(30);
let average = stats.mean([...s]);
예제 1