• javascript闭包的使用--按钮切换


    闭包实现按钮状态切换

    看下面的代码:

     1 var toggleBtn = document.getElementById('toggle');
     2 
     3 var toggleFun = (function() {
     4   var checked = true;
     5 
     6   return function() {
     7     var color = checked ? 'red' : 'white';
     8     toggleBtn.style.backgroundColor = color;
     9     checked = !checked;
    10   };
    11 })();
    12 
    13 // 切换按钮
    14 toggleBtn.addEventListener('click', toggleFun);

    解释
    上面的代码实现了点击按钮切换样式的功能,它用到了js的闭包特性。简单解释下:
    toggleFun为一个立即执行函数,执行后toggleFun被赋值为内部函数:

    1 toggleFun = function() {
    2     color = checked ? 'red' : 'white';
    3     toggleBtn.style.backgroundColor = color;
    4     checked = !checked;
    5 }

    这个函数用到了外部函数的checked变量,这也是checked变量在立即执行函数执行完成后未被销毁的原因,因为还有其他地方用到了它。那么这个内部函数被用作事件监听器的回调函数,每点击一次就会被调用一次,从而可以通过更改checked的值来实现按钮切换效果。立即执行函数内的函数被全局下的toggleFun变量引用了,这就创建了一个闭包。

    简而言之,闭包的作用就是在立即执行函数执行完并返回后,使得javascript的垃圾回收机制不会收回立即函数所占用的资源,因为立即执行函数的内部函数依赖立即执行函数中的变量。
    额,上面写的太啰嗦了,下面把代码稍微改下,加些注释就会更加清晰:

     1 var toggleBtn = document.getElementById('toggle');
     2 
     3 var outerFun = function() {
     4   var checked = true;
     5 
     6   // innerFun声明时用到了outerFun的局部变量
     7   var innerFun = function() {
     8     var color = checked ? 'red' : 'white';
     9     toggleBtn.style.backgroundColor = color;
    10     checked = !checked;
    11   };
    12 
    13   return innerFun;
    14 };
    15 
    16 var toggleFun = outerFun(); // toggleFun指向innerFun
    17 
    18 // 切换按钮,每次点击都会调用innerFun
    19 toggleBtn.addEventListener('click', toggleFun);

    不用闭包,用全局变量
    其实不用闭包也能实现按钮切换,不过就得用到全局变量来存储按钮状态:

     1 var toggleBtn = document.getElementById('toggle');
     2 var checked = true; // 全局变量存储按钮状态
     3 
     4 var toggleFun = function() {
     5   var color = checked ? 'red' : 'white';
     6   toggleBtn.style.backgroundColor = color;
     7   checked = !checked;
     8 };
     9 
    10 toggleBtn.addEventListener('click', toggleFun);

    但全局变量用多了会不好维护,代码不好控制。


    这篇文章最初发表在我自己折腾的博客站点上:javascript闭包的使用--按钮切换,该博客用了一位前辈开源的源码,基于thinkjs和vuejs开发,欢迎大家来逛逛。

  • 相关阅读:
    docker学习构建镜像---第三章节
    docker学习端口映射---第二章节
    推荐一个小而美的Python代码格式化工具
    Bi-LSTM+CRF在文本序列标注中的应用
    大数据分析师到底在干嘛
    Pytorch实现的语义分割器
    Python大数据与机器学习之NumPy初体验
    python数据分析工具——Pandas、StatsModels、Scikit-Learn
    Python修改paramiko模块开发运维审计保垒机
    Python数据预处理:使用Dask和Numba并行化加速
  • 原文地址:https://www.cnblogs.com/yangtoude/p/js-clourse-toggle-button.html
Copyright © 2020-2023  润新知