热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

[路飞]每日一答:如何利用闭包和立即执行函数实现类库的封装?

[路飞]每日一答:如何利用闭包和立即执行函数实现类库的封装?-highlight:ascetictheme:channing-cyan如何利用闭包和立即执行函数实现类库的封装

highlight: ascetic
theme: channing-cyan

如何利用闭包和立即执行函数实现类库的封装

封装类库的特点

类库是我们在开发中经常用到的,但是在使用的时候我们很少会考虑他是如何设计的,如何实现封装的。

首先我们要了解类库的特点是什么。类库最基础的要求就是高复用性和低耦合性。这就引申出类库实际上不仅要求脱离业务更要求他有自己的作用域和命名空间。那么利用闭包和立即执行函数就可以做到这一点。

比较一下

第一种写法:

var name = 'defaultName' // 变量 name
function Person () {
  this.name = name // 属性 name 默认为变量 name
}

const p = new Person()
console.log(p) // Person {name: "detaultName"}

这么写功能上固然是没有问题的,我们可以看到返回了一个默认值为 defaultNameperson对象
。但是,如果你尝试去打印 this.name 或者 window.name :

console.log(this.name) // defaultName
console.log(window.name) // defaultName

不难发现,我们全局作用域下的 name属性也受到了影响。

第二种写法

const Person = (function () {
  var name = 'defaultName' // 变量 name
  const Person = function () {
    this.name = name // 属性 name 默认为变量 name
  }
  return Person
})()

const p = new Person()
console.log(p) // Person {name: "detaultName"}
console.log(this.name) // ''
console.log(window.name) // ''

采用了闭包和立即执行函数的形式,为类库的实现创建了单独的作用空间,最终返回一个对象或一个方法的形式。这样一来,类库下的作用域以及变量就不会对全局造成影响,也不会受到命名的限制。

典型案例

大名鼎鼎 jQuery 架构:

;(function(global, factory) { 
    factory(global); 
}(typeof window !== "undefined" ? window : this, function(window, noGlobal) { 
    var jQuery = function( selector, context ) { 
        return new jQuery.fn.init( selector, context ); 
    }; 
    jQuery.fn = jQuery.prototype = {}; 
    // 核心方法 
    // 回调系统 
    // 异步队列 
    // 数据缓存 
    // 队列操作 
    // 选择器引 
    // 属性操作 
    // 节点遍历 
    // 文档处理 
    // 样式操作 
    // 属性操作 
    // 事件体系 
    // AJAX交互 
    // 动画引擎 
    return jQuery; 
})); 

尝试去分解一下。首先是一个自执行函数:

function(global, factory) { factory(global); }

它包含了两个入参,第一个是挂载对象(默认全局),第二个是工厂方法。那么这个自执行对象的传参分别是

typeof window !== "undefined" ? window : this

以及下面的整段方法了

function(window, noGlobal) { 
    var jQuery = function( selector, context ) { 
        return new jQuery.fn.init( selector, context ); 
    }; 
    jQuery.fn = jQuery.prototype = {}; 
    // 核心方法 
    // 回调系统 
    // 异步队列 
    // 数据缓存 
    // 队列操作 
    // 选择器引 
    // 属性操作 
    // 节点遍历 
    // 文档处理 
    // 样式操作 
    // 属性操作 
    // 事件体系 
    // AJAX交互 
    // 动画引擎 
    return jQuery; 
}

如果我们不使用立即执行函数去实现就应该会变成这样:

var window = typeof window !== "undefined" ? window : this
function(window) { 
    var jQuery = function( selector, context ) { 
        return new jQuery.fn.init( selector, context ); 
    }; 
    jQuery.fn = jQuery.prototype = {}; 
    // 核心方法 
    // 回调系统 
    // 异步队列 
    // 数据缓存 
    // 队列操作 
    // 选择器引 
    // 属性操作 
    // 节点遍历 
    // 文档处理 
    // 样式操作 
    // 属性操作 
    // 事件体系 
    // AJAX交互 
    // 动画引擎 
    return jQuery; 
}

由于自身的入参本身就是全局对象window,这种写法可能也不会对全局造成什么影响,但是也太不优雅了。


推荐阅读
  • vue使用
    关键词: ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 本文介绍了如何使用jQuery和AJAX来实现动态更新两个div的方法。通过调用PHP文件并返回JSON字符串,可以将不同的文本分别插入到两个div中,从而实现页面的动态更新。 ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
  • 本文介绍了在满足特定条件时如何在输入字段中使用默认值的方法和相应的代码。当输入字段填充100或更多的金额时,使用50作为默认值;当输入字段填充有-20或更多(负数)时,使用-10作为默认值。文章还提供了相关的JavaScript和Jquery代码,用于动态地根据条件使用默认值。 ... [详细]
  • jQuery实现简单的动画效果及用法详解
    本文详细介绍了使用jQuery实现简单动画效果的方法,包括显示/隐藏、向上收缩/向下展开、淡入/淡出、自定义动画等。同时提供了具体的用法示例,并解释了参数的含义和使用技巧。通过本文的学习,读者可以掌握如何使用jQuery实现各种动画效果,为网页增添生动和互动性。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了如何使用动态尺寸巧妙地将R中的数组子集化。作者通过解释数组的三个维度以及第三个维度的长度可变性,提出了一种周期性子集化数组的方法,并举例说明了如何创建第二个数组。这个方法对于制作模拟模型非常有用。 ... [详细]
  • 本文介绍了在Android开发中使用软引用和弱引用的应用。如果一个对象只具有软引用,那么只有在内存不够的情况下才会被回收,可以用来实现内存敏感的高速缓存;而如果一个对象只具有弱引用,不管内存是否足够,都会被垃圾回收器回收。软引用和弱引用还可以与引用队列联合使用,当被引用的对象被回收时,会将引用加入到关联的引用队列中。软引用和弱引用的根本区别在于生命周期的长短,弱引用的对象可能随时被回收,而软引用的对象只有在内存不够时才会被回收。 ... [详细]
author-avatar
阡蓝fliona
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有