JavaScript沒有傳統意義上的命名空間。這只是一個術語,用於描述在對象結構中組織庫的功能。
閉包很有用,因爲庫通常希望將變量存儲在變量中,而無需將這些變量暴露給任何其他代碼。
如果該數據暴露在名稱空間對象上,則庫的用戶很難判斷哪些屬性設計爲與之交互,哪些屬性僅供內部使用。
考慮例如:
var example_namespace = (function() {
var interval;
var element;
function start() {
if (interval) {
return;
}
if (!element) {
element = document.querySelector('span');
}
interval = setInterval(increment, 500);
}
function stop() {
clearInterval(interval);
interval = null;
}
function increment() {
element.innerHTML++;
}
return {
counter: {
start: start,
stop: stop
}
};
}());
addEventListener('load', function() {
document.querySelector('#start').addEventListener('click', example_namespace.counter.start);
document.querySelector('#stop').addEventListener('click', example_namespace.counter.stop);
});
Count:
<span>0</span>
<button type="button" id="start">start</button>
<button type="button" id="stop">stop</button>
在不使用一個封閉件,interval
,element
,並increment
將所有被命名空間物體或全局上露出。
對不起,我沒有看到在你的例子中暴露名稱空間對象上的'interval','element'和'increment'的問題。 – Growler 2014-11-21 20:42:01
揭示它們除了讓它更容易打破它,更難理解外,什麼都不做。 – Quentin 2014-11-21 21:00:35