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'});

    参考链接   参考链接

  • 相关阅读:
    笔记
    BlangenOA项目展示(附源码)
    笔记截至20190406
    ASP.NET MVC 使用过滤器需要注意
    单例模式和HttpContext线程内唯一
    C#线程/进程同步(lock、Mutex、Semaphore)
    Web标准
    JavaScript 放置在文档最后面可以使页面加载速度更快
    GUI 面板实现 (解决了关闭事件)
    GUI 实现多个窗口 (使用封装特性)
  • 原文地址:https://www.cnblogs.com/GoCircle/p/9804106.html
Copyright © 2011-2022 走看看