文档章节

深入理解javascript函数模块机制

bosscheng
 bosscheng
发布于 2014/12/11 21:35
字数 576
阅读 131
收藏 15

我们可以使用函数和闭包来实现模块,模块是一个提供接口却隐藏状态和实现的函数或者说是对象。通过使用函数创建模块,我们几乎可以摈弃全局变量的使用。


举例:

    需要实现一个方法,任务是寻找字符串中的html字符实体并把他们替换成对应的字符,这里就需要在一个对象中保存字符实体的名称和对应的字符。

    我们在哪边存放这个对象呢?可以放在全局变量中,也可以放在该函数的内部。但是全局变量是魔鬼,放在函数内部的话会带来运行的时候消耗,因为每次执行该函数的时候该字面量都会被赋值一次

    最理想的做法就是把他放在一个闭包中,而且也许可以提供一个增加更多字符实体的扩展方法

String.prototype.deentityify = function(){
    var entiry = {
        quto:'"',
        lt:'<',
        qt:'>'
    };
    
    // 通过执行函数,来返回所需要创建的函数。
    return function(){
        return this.replace(/$([^&;]+;)/g,function(a,b){
            var r = entiry[b];
            return typeof r === 'string' ? r:a;
        })
    }();
}

模块模式利用了函数作用域和闭包来创建被绑定对象和私有成员的关联。


模块模式的一般形式:

    一个定义了私有变量和函数的函数,利用闭包创建可以访问私有变量和函数的特权函数,最后返回这个特权函数,或者把他们保存到一个可以访问到的地方。


使用模块模式就可以不使用全局变量了。


对于模块模式也可以创建安全的对象

var serialMarker = function(){
    var prefix = "";
    var seq = 0;
    return {
        setPrefix : function(p){
            prefix = String(p);
        },
        
        setSeq : function(s){
            seq = s;
        },
        
        genSys : function(){
            var result = prefix + seq;
            seq += 1;
            return result;
        }
    }
}


var seqer = serialMarker();
        seqer.setPrefix('p');
        seqer.setSeq(1000);
        var unique = seqer.genSys();
        console.log(unique);   // p1000

由于提供的方法中没有使用到this对象,因此没有办法去破坏方法,除非调用提供的方法去修改 seq 和 prefix 参数,否则无法修改。 对于 seqer 对象是可变的,所以他的方法可能会被替换掉,但是替换掉的方法仍然无法访问私有成员。


© 著作权归作者所有

bosscheng
粉丝 80
博文 303
码字总数 95443
作品 0
南京
前端工程师
私信 提问
前端进阶(第一期)-调用堆栈笔记

1-1 理解 Javascript 执行上下文和执行栈 原文地址 知识点有: JavaScript程序的内部执行机制; 理解执行上下文和执行栈; 理解以上知识点有助于理解JavaScript的提升机制、作用域和闭包 执行...

xszi
2018/12/04
0
0
好程序员web前端分享JS引擎的执行机制

  好程序员web前端分享JS引擎的执行机制,请先着重牢记两点!JS是单线程语言。 JS的EventLoop是JS的执行机制。深入了解JS的执行,就等于深入了解JS里的eventloop。 1、灵魂三问:JS为什么是...

好程序员IT
06/12
9
0
javascript——从「最被误解的语言」到「最流行的语言」

JavaScript曾是“世界上最被误解的语言”,因为它担负太多的特性,包括糟糕的交互和失败的设计,但随着Ajax的到来,JavaScript“从最受误解的编程语言演变为最流行的语言”,这除了幸运之外,...

modernizr
2014/05/20
1K
12
前端修炼——Node.js(一)

版权声明:本文已在我的公众号:【前端很忙】,原创首发,欢迎关注~!转载请务必注明出处! https://blog.csdn.net/BsQ/article/details/84839734 最近在学习 Node,看的是朴灵老师编著的《深...

前端很忙
2018/12/05
0
0
React Native 从入门到原理

动态配置 由于 AppStore 审核周期的限制,如何动态的更改 app 成为了永恒的话题。无论采用何种方式,我们的流程总是可以归结为以下三部曲:“从 Server 获取配置 --> 解析 --> 执行native代码...

HeroHY
2017/02/13
20
0

没有更多内容

加载失败,请刷新页面

加载更多

程序设计基础(C)第06讲例程

1summing.c /* summing.c -- 根据用户键入的整数求和 */#include <stdio.h>int main(void){ long num; long sum = 0L; /* 把sum 初始化为0 */ int status; p......

树人大学数字媒体吴凡
15分钟前
4
0
聊聊nacos config的publishConfig

序 本文主要研究一下nacos config的publishConfig ConfigController nacos-1.1.3/config/src/main/java/com/alibaba/nacos/config/server/controller/ConfigController.java @Controller@R......

go4it
43分钟前
3
0
Eureka应用注册与集群数据同步源码解析

在之前的EurekaClient自动装配及启动流程解析一文中我们提到过,在构造DiscoveryClient类时,会把自身注册到服务端,本文就来分析一下这个注册流程 客户端发起注册 boolean register() t...

Java学习录
52分钟前
11
0
Java描述设计模式(15):责任链模式

本文源码:GitHub·点这里 || GitEE·点这里 一、生活场景描述 1、请假审批流程 公司常见的请假审批流程:请假天数 当 day<=3 天,项目经理审批当 3<day<=5 天,部门经理审批当 day>5 天...

知了一笑
今天
10
0
总结:数组与链表

1、内存申请:数组在内存上是连续的空间;链表,内存地址上可以是不连续的。 2、查询速度:数组可以随机访问,链表必须顺序访问,即从首个元素开始遍历,逐个查找,所以数组查询很快。 3、写入...

浮躁的码农
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部