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 相关文章推荐
初学js插入节点appendChild insertBefore使用方法
Jul 04 Javascript
js动态添加删除,后台取数据(示例代码)
Nov 25 Javascript
javascript中定义类的方法详解
Feb 10 Javascript
Vuejs第九篇之组件作用域及props数据传递实例详解
Sep 05 Javascript
jQuery鼠标事件总结
Oct 13 Javascript
arcgis for js 修改infowindow样式的方法
Nov 02 Javascript
详解plotly.js 绘图库入门使用教程
Feb 23 Javascript
vuex 解决报错this.$store.commit is not a function的方法
Dec 17 Javascript
jQuery zTree插件使用简单教程
Aug 16 jQuery
jQuery使用ajax传递json对象到服务端及contentType的用法示例
Mar 12 jQuery
探索浏览器页面关闭window.close()的使用详解
Aug 21 Javascript
微信小程序实现滚动Tab选项卡
Nov 16 Javascript
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
DIY实用性框形天线
2021/03/02 无线电
PHP 程序授权验证开发思路
2009/07/09 PHP
PHP魔术方法的使用示例
2015/06/23 PHP
thinkphp实现分页显示功能
2016/12/03 PHP
为调试JavaScript添加输出窗口的代码
2010/02/07 Javascript
javascript学习笔记(六) Date 日期类型
2012/06/19 Javascript
jQuery实现表头固定效果的实例代码
2013/05/24 Javascript
Jquery.addClass始终无效原因分析
2013/09/08 Javascript
JS来动态的修改url实现对url的增删查改
2014/09/05 Javascript
自己封装的常用javascript函数分享
2015/01/07 Javascript
JavaScript使用Math.Min返回两个数中较小数的方法
2015/04/06 Javascript
快速解决jquery.touchSwipe左右滑动和垂直滚动条冲突
2016/04/15 Javascript
BootStrap的JS插件之轮播效果案例详解
2016/05/16 Javascript
jQuery的层级查找方式分析
2016/06/16 Javascript
JS监听微信、支付宝等移动app及浏览器的返回、后退、上一页按钮的事件方法
2016/08/05 Javascript
JavaScript评论点赞功能的实现方法
2017/03/13 Javascript
fullPage.js和CSS3实现全屏滚动效果
2017/05/05 Javascript
深入讲解xhr(XMLHttpRequest)/jsonp请求之abort
2017/07/26 Javascript
JavaScript定时器setTimeout()和setInterval()详解
2017/08/18 Javascript
vue2.0之多页面的开发的示例
2018/01/30 Javascript
js传递数组参数到后台controller的方法
2018/03/29 Javascript
[01:10]3.19DOTA2发布会 三代刀塔人第一代
2014/03/25 DOTA
简单了解OpenCV是个什么东西
2017/11/10 Python
Python 实现还原已撤回的微信消息
2019/06/18 Python
python实现代码统计程序
2019/09/19 Python
pyspark给dataframe增加新的一列的实现示例
2020/04/24 Python
实现ECharts双Y轴左右刻度线一致的例子
2020/05/16 Python
得到Class的三个过程是什么
2012/08/10 面试题
文明青少年标兵事迹材料
2014/01/28 职场文书
计算机通信专业推荐信
2014/02/22 职场文书
爱岗敬业演讲稿
2014/05/05 职场文书
未婚证明书模板
2014/10/08 职场文书
办公室规章制度范本
2015/08/04 职场文书
品牌形象定位,全面分析
2019/07/23 职场文书
Matlab求解数组中的最大值及它所在的具体位置
2021/04/16 Python
Springboot/Springcloud项目集成redis进行存取的过程解析
2021/12/04 Redis