关于闭包的this question中的答案表明闭包的重要性是"因为javascript没有像命名空间这样的功能,并且你可以很容易地搞乱所有类型的全局对象。 #34; msn guide将其描述为"词汇范围。"
并且this question非常清楚地描述了命名空间和闭包之间的区别......
所以我想知道,如果Javascript实际上确实有我常用的命名空间,那么现在关闭的用途是什么?当我可以通过名称空间组织和使用它时,我根本不会看到需要用闭包词法作用域来关闭变量。
答案 0 :(得分:1)
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
都会在命名空间对象或全局变量上公开。