zoukankan      html  css  js  c++  java
  • JavaScript 使用闭包保护变量 防止污染

    使用JavaScript编写插件或团队协作时,可使用闭包来解决此类以下两个问题:

    1、定义过多全局变量,可能会造成全局变量命名冲突;

    2、在插件内定义变量,需要保护该变量不被轻易修改;

    优点:可以把局部变量驻留在内存中,可以避免使用全局变量;在调用过后不会被垃圾机制回收;

    缺点:避免滥用闭包,占用更多内存的缺点,用完要及时让垃圾回收器回收 ( fn=null)应及时解除引用,否则会占用更多存;

    闭包简单示例

    最后一步return了一个函数,这个函数callName可将闭包内部变量值取出,也就避免了变量污染;

    var name = "外部name";
    var init = (function(){
        var name = "内部name";
        function callName(){
            console.log(name);
            //打印name
        }
        return function(){
            callName();
            //形成接口
        }
    }());
    init();

    如果需要对重要参数防止被篡改,可使用闭包规定变量的getter和setter

    例如

    const CHANGE_FONT_SILE='CHANGE_FONT_SILE';
    //设置一个闭包,把变量保护起来,通过返回值调用
    function createStore() {
      let appState={
        fontSize:'26px',
        title:{
          text:'标题',
          color:'red'
        },
        content:{
          text:'类容',
          color:'green'
        }
      }
      //保护变量被修改,深克隆
      let getter=()=>JSON.parse(JSON.stringify(appState));
      //改变变量的方法,action代表一个命令对象,就是一个普通的js对象,起码需要一个字段控制命令类型type
      let setter=(action)=>{
        switch(action.type){
          case CHANGE_FONT_SILE:
            appState.fontSize=action.fontSize;
          default:
            return;
        }
      }
      //返回出去的修改和取值的接口
     return{
       getter,
       setter
     }
    }
    let store=createStore();
    //取值函数
    store.getter().fontSize;
    //修改函数
    store.setter({type:CHANGE_FONT_SILE,fontSize:'30px'});

    参考链接   参考链接

  • 相关阅读:
    ansible使用
    git undo last commit
    metadata简介
    tinyint(4),tinyint(80)有什么区别
    php 打印debug日志
    tinycore Network card configuration during exec bootlocal.sh
    Windows使用CMD命令查看进程和终止进程
    @NotEmpty,@NotNull和@NotBlank的区别
    spring boot 程序启动缓慢的问题(二)
    LocalDateTime的一些用法
  • 原文地址:https://www.cnblogs.com/GoCircle/p/9804106.html
Copyright © 2011-2022 走看看