javascript - JavaScript 中闭包的实际用途是什么?

标签 javascript closures terminology

我是 trying我最难理解 JavaScript 闭包。

我通过返回一个内部函数来获得这一点,它可以访问在其直接父级中定义的任何变量。

这对我有什么用处?也许我还没有完全理解它。大部分examples I have seen online不提供任何真实世界的代码,只是模糊的例子。

有人可以告诉我闭包的真实使用吗?

例如是这个吗?

var warnUser = function (msg) {
    var calledCount = 0;
    return function() {
       calledCount++;
       alert(msg + '\nYou have been warned ' + calledCount + ' times.');
    };
};

var warnForTamper = warnUser('You can not tamper with our HTML.');
warnForTamper();
warnForTamper();

最佳答案

假设,您想统计用户点击网页上某个按钮的次数

为此,您将在按钮的 onclick 事件上触发一个函数来更新变量的计数

<button onclick="updateClickCount()">click me</button>

现在可能有很多方法,例如:

  1. 您可以使用全局变量,以及增加计数器的函数:

     var counter = 0;
    
     function updateClickCount() {
         ++counter;
         // Do something with counter
     }
    

    但是,陷阱在于页面上的任何脚本都可以更改计数器,而无需调用 updateClickCount()


  1. 现在,您可能正在考虑在函数内声明变量:

     function updateClickCount() {
         var counter = 0;
         ++counter;
         // Do something with counter
     }
    

    但是,嘿!每次调用 updateClickCount() 函数时,计数器都会再次设置为 1。


  1. 考虑嵌套函数

    嵌套函数可以访问它们“上方”的范围。

    在本例中,内部函数 updateClickCount() 可以访问父函数 countWrapper() 中的计数器变量:

     function countWrapper() {
         var counter = 0;
         function updateClickCount() {
             ++counter;
             // Do something with counter
         }
         updateClickCount();
         return counter;
     }
    

    如果你可以从外部访问 updateClickCount() 函数并且你还需要找到一种方法来执行 counter = 0不是每次都只有一次。


  1. 救援结束! (自调用函数):

     var updateClickCount = (function(){
         var counter = 0;
    
         return function(){
             ++counter;
             // Do something with counter
         }
     })();
    

    自调用函数只运行一次。它将 counter 设置为零 (0),并返回一个函数表达式。

    这样 updateClickCount 就变成了一个函数。 “奇妙”的部分是它可以访问父范围内的计数器。

    这称为 JavaScript 闭包。它使函数可以具有“private”变量。

    counter受匿名函数作用域保护,只能使用updateClickCount()函数更改!

更生动的闭包示例

<script>
var updateClickCount = (function(){
    var counter = 0;

    return function(){
        ++counter;
        document.getElementById("spnCount").innerHTML = counter;
    }
})();
</script>

<html>
<button onclick="updateClickCount()">click me</button>
<div> you've clicked
    <span id="spnCount"> 0 </span> times!
</div>
</html>


引用: JavaScript Closures

关于javascript - JavaScript 中闭包的实际用途是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2728278/

相关文章:

terminology - 为什么布隆过滤器被称为 "filters"?

java - @Model注解和MVC

javascript - SyntaxError : JSON. 解析:意外字符

javascript - CSS 当使用溢出时,差距仍然存在

Javascript:用另一个函数重新分配一个函数

algorithm - 算法和函数有什么区别?

javascript - 在 Typescript 中嵌套模板字符串

javascript - 如何在旧版本的 Internet Explorer 中支持 HTML5 音频标签?

ios - 如何将实际数据从一个闭包获取到另一个闭包?

Grails:在另一个闭包中使用多个闭包