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

    参考链接   参考链接

  • 相关阅读:
    NetBeans 时事通讯(刊号 # 143 Apr 19, 2011)
    道道道
    係要听ROCK N' ROLL
    JPA 缓存与应用集群
    NetBeans 时事通讯(刊号 # 144 Apr 28, 2011)
    係要听ROCK N' ROLL
    道道道
    JPA 缓存与应用集群
    twemproxy (nutcracker) Build Status
    Java 与 C进行Socket通讯
  • 原文地址:https://www.cnblogs.com/GoCircle/p/9804106.html
Copyright © 2011-2022 走看看