JavaScript中消除闭包的一般方法介绍


Posted in Javascript onMarch 16, 2015

JavaScript 的闭包是一个其主动发展的特性, 也是一个被动发展的特性. 也就是说, 一方面, JS 有了闭包能更好解决一些问题. 另一方面, JS 为了解决某些问题, 而不得不使用闭包勉强来解决问题.

前者这里不讨论, 如果 JS 闭包能更好的解决问题, 当然使用闭包更好.

我讨论的是后者, 是因为 JS 本身的限制, 而不得不磕磕绊绊地用闭包来解决的问题, 例如"变量只初始化一次"这样的需求.

常规的语言这样解决:

class Class{

 function init(){

  this.n = 0;

 }

 function func(){

  this.n ++;

  return this.n;

 }

}

var obj = new Class();

JavaScript 一般会这样解决(使用闭包):

var obj = {

 func : (function(){

  var n = 0;

  return function(){

   n ++;

   return n;

  }

 })()

}

但我更建议采用这种方法(消除闭包):

function Class(){

 var self = this;

 self.n = 0;

 self.func = function(){

  self.n ++;

  return self.n;

 }

}

var obj = new Class();

因为后者的可扩展性更好. 当你需要实现对一个变量的不同操作时, 后一种可以只需要再定义一个不同的函数(也就是简单线性扩展), 而前一种(闭包)则需要完全重写(这就是为什么你经常听到重构这个词的原因).

Javascript 相关文章推荐
prototype Element学习笔记(篇二)
Oct 26 Javascript
利用策略模式与装饰模式扩展JavaScript表单验证功能
Feb 14 Javascript
ReactNative踩坑之配置调试端口的解决方法
Jul 28 Javascript
redux-saga 初识和使用
Mar 10 Javascript
echarts同一页面中四个图表切换的js数据交互方法示例
Jul 03 Javascript
原生JS实现旋转轮播图+文字内容切换效果【附源码】
Sep 29 Javascript
对angularJs中$sce服务安全显示html文本的实例
Sep 30 Javascript
详解vuex之store拆分即多模块状态管理(modules)篇
Nov 13 Javascript
webpack4 从零学习常用配置(小结)
May 28 Javascript
浅谈bootstrap layer.open中end的使用方法
Sep 12 Javascript
JS 创建对象的模式实例小结
Apr 28 Javascript
vue3.0封装轮播图组件的步骤
Mar 04 Vue.js
jQuery实现的支持IE的html滑动条
Mar 16 #Javascript
JavaScript计算两个日期时间段内日期的方法
Mar 16 #Javascript
nw.js实现类似微信的聊天软件
Mar 16 #Javascript
JavaScript控制table某列不显示的方法
Mar 16 #Javascript
详解addEventListener的三个参数之useCapture
Mar 16 #Javascript
解决Jquery向页面append新元素之后事件的绑定问题
Mar 16 #Javascript
jquery中radio checked问题
Mar 16 #Javascript
You might like
php feof用来识别文件末尾字符的方法
2010/08/01 PHP
PHP实现把文本中的URL转换为链接的auolink()函数分享
2014/07/29 PHP
详解PHP的Yii框架中组件行为的属性注入和方法注入
2016/03/18 PHP
Yii框架日志记录Logging操作示例
2018/07/12 PHP
静态的动态续篇之来点XML
2006/12/23 Javascript
javascript while语句和do while语句的区别分析
2007/12/08 Javascript
jquery 图片截取工具jquery.imagecropper.js
2010/04/09 Javascript
JS实现点击下载的小例子
2013/07/10 Javascript
Javascript call和apply区别及使用方法
2013/11/14 Javascript
JavaScript判断变量是否为undefined的两种写法区别
2013/12/04 Javascript
JQuery选中checkbox方法代码实例(全选、反选、全不选)
2015/04/27 Javascript
详解Node.js包的工程目录与NPM包管理器的使用
2016/02/16 Javascript
基于jQuery实现页面搜索功能
2020/03/26 Javascript
Angular的$http与$location
2016/12/26 Javascript
WebSocket实现简单客服聊天系统
2017/05/12 Javascript
JavaScript中错误正确处理方式小结你用对了吗
2017/10/10 Javascript
axios简单实现小程序延时loading指示
2018/07/30 Javascript
利用vue.js把静态json绑定bootstrap的table方法
2018/08/28 Javascript
解决vue的变量在settimeout内部效果失效的问题
2018/08/30 Javascript
微信小程序自定义弹窗wcPop插件
2018/11/19 Javascript
微信小程序 搜索框组件代码实例
2019/09/06 Javascript
小程序如何写动态标签的实现方法
2020/02/05 Javascript
python实现web方式logview的方法
2015/08/10 Python
python Socket之客户端和服务端握手详解
2017/09/18 Python
用python处理MS Word的实例讲解
2018/05/08 Python
python通过微信发送邮件实现电脑关机
2018/06/20 Python
python直接获取API传递回来的参数方法
2018/12/17 Python
使用APScheduler3.0.1 实现定时任务的方法
2019/07/22 Python
Python generator生成器和yield表达式详解
2019/08/08 Python
Python爬取豆瓣视频信息代码实例
2019/11/16 Python
IronPython连接MySQL的方法步骤
2019/12/27 Python
HTML5之SVG 2D入门4—笔画与填充
2013/01/30 HTML / CSS
2014年五一促销活动方案
2014/03/09 职场文书
唐山大地震的观后感
2015/06/05 职场文书
基于JavaScript实现年月日三级联动
2021/06/22 Javascript
MySQL派生表联表查询实战过程
2022/03/20 MySQL