javascript - 关于 javascript 闭包的 w3schools 示例实际上没用吗?

标签 javascript closures counter

<分区>

我在 w3schools 上阅读了这个关于 Javascript 闭包应用于“反困境”的例子:

https://www.w3schools.com/js/js_function_closures.asp

在实际使用中,这个例子看起来几乎是无稽之谈。当我无法保护包含函数本身的变量“add”时,为什么我应该将变量“counter”包装到一个闭包中,以防止在全局范围内被意外修改?

更具体地说...我有这段代码:

var add = (function () {
    var counter = 0;
    return function () {return counter += 1;}
})();

add();
add();
add();

// the counter is now 3

W3schools 在开始时说:“问题是,页面上的任何脚本 [在全局范围内] 都可以更改计数器,而无需调用 add()。”...建议将上面的闭包作为解决方案。好的。但是如何保护“添加”不被订阅呢?这使得变量仍然“易受攻击”。

那么,闭包实现的优势是什么?

最佳答案

在w3schools给出的例子中,他们用上述闭包解决的问题是保护变量counter不被直接修改。如果 counter 在全局范围内,然后您定义了一个函数,例如 add 以将计数器递增某个值,那么您所做的就是为其他函数定义了一个接口(interface)与 counter 变量交互的部分代码。

当您在某些数据和代码库的其他部分之间定义接口(interface)时,您可能希望强制执行该接口(interface)是理所当然的。换句话说,如果您将 counter 放在全局范围内,则无法强制使用您的 add 函数,因为我只能这样做: counter += 7 就在全局范围内。

counter 变量包装在闭包中允许您从全局范围隐藏 counter 变量,这意味着修改 counter 的唯一方法是通过 添加功能。这通过防止直接修改 counter 变量的值来强制使用 add

所以这是一个简单但很好的例子,说明如何使用闭包创建私有(private)变量。

关于javascript - 关于 javascript 闭包的 w3schools 示例实际上没用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48748971/

相关文章:

javascript - Mocha 测试和 Three.js;三未定义

arrays - Swift 闭包表达式

python - 返回不断变化的变量python

javascript - 在 typescript/javascript 中使用 fetch 读取 JSON

javascript - Ember 阵列 Controller 中长列表的内存问题

Javascript .split() 每个字符数的字符串

swift - 在 'self' 闭包中捕获 `@Sendable`

Javascript 初始化图像数组

java - 初学者 Java 计数器代码

c - 换行符在格式字符串中时 scanf 的行为