闭包与命名空间的相关性和用法
relevance and use for closures vs namespacing
这个
关于闭包的问题的答案指出了闭包的重要性是"因为javascript没有像命名空间这样的功能,而且你可以很容易地搞砸各种全局对象。MSN指南将其描述为"词汇范围"。
这个问题非常清楚地描绘了命名空间和闭包之间的区别......
所以我想知道,如果Javascript确实有我经常使用的命名空间,那么现在闭包有什么用?当我可以通过命名空间组织和使用变量时,我根本不认为有必要使用闭包词法范围关闭变量。
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
都将在命名空间对象或全局变量上公开。
相关文章:
- 无法安装节点sass相关性
- 原型和用法 Javascript
- JavaScript数据库相关性
- 在IntelliJ IDEA中,如何将JS文件从“;查找用法“;使用TypeScript时的结果
- 限制npm依赖模块's require(隔离)的用法
- 引导工具提示用法,在搜索字段中
- 用于添加两个数字的javascript闭包的用法
- 在哪里指定模块相关性
- javascript中不带转义字符串的${variable}用法
- 了解插件代码中$.each内部传递的参数的用法
- Chris Coyer中call()的用法'的自定义事件示例
- regex中连字符的这种用法有效吗
- 需要帮助在 JavaScript 中创建相关性计算器
- 咕噜咕噜/咕噜咕噜源文件目标用法
- 时间序列统计(如相关性、傅里叶变换)
- 不是 solr 查询中的条件用法
- Web Crypto API JWK 在 Python 中的用法
- 与为生产站点编译多个 js 文件的相关性
- YUI Compressor Maven Mojo缩小javascript的用法
- 闭包与命名空间的相关性和用法