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 相关文章推荐
JQuery的一些小应用收集
Mar 27 Javascript
一个关于javascript匿名函数的问题分析
Mar 30 Javascript
Jquery实现纵向横向菜单
Jan 24 Javascript
学习使用AngularJS文件上传控件
Feb 16 Javascript
Bootstrap模仿起筷首页效果
May 09 Javascript
利用AngularJs实现京东首页轮播图效果
Sep 08 Javascript
Bootstrap 网站实例之单页营销网站
Oct 20 Javascript
easyui-combobox 实现简单的自动补全功能示例
Nov 08 Javascript
微信小程序实现左滑修改、删除功能
Oct 19 Javascript
react+redux仿微信聊天界面
Jun 21 Javascript
详解Vue.js和layui日期控件冲突问题解决办法
Jul 25 Javascript
JavaScript 事件代理需要注意的地方
Sep 08 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
php 中include()与require()的对比
2006/10/09 PHP
php中使用explode查找某个字符是否存在的方法
2011/07/12 PHP
php 中英文语言转换类
2011/09/07 PHP
使用JavaScript创建新样式表和新样式规则
2016/06/14 PHP
JavaScript 模拟用户单击事件
2009/12/31 Javascript
Javascript全局变量var与不var的区别深入解析
2013/12/09 Javascript
javascript 密码框防止用户粘贴和复制的实现代码
2014/02/17 Javascript
Nodejs中自定义事件实例
2014/06/20 NodeJs
JavaScript中原型和原型链详解
2015/02/11 Javascript
jQuery找出网页上最高元素的方法
2015/03/20 Javascript
JavaScript中windows.open()、windows.close()方法详解
2016/07/28 Javascript
node.js实现博客小爬虫的实例代码
2016/10/08 Javascript
浅谈通过JS拦截 pushState和replaceState事件
2017/07/21 Javascript
基于Vue实现图书管理功能
2017/10/17 Javascript
D3.js(v3)+react 实现带坐标与比例尺的柱形图 (V3版本)
2019/05/09 Javascript
Vue中props的详解
2019/05/16 Javascript
vue 自定指令生成uuid滚动监听达到tab表格吸顶效果的代码
2020/09/16 Javascript
[55:25]2018DOTA2亚洲邀请赛3月29日 小组赛A组 VG VS OG
2018/03/30 DOTA
Python 用户登录验证的小例子
2013/03/06 Python
详解Python nose单元测试框架的安装与使用
2017/12/20 Python
Python基于高斯消元法计算线性方程组示例
2018/01/17 Python
pyQt5实时刷新界面的示例
2019/06/25 Python
使用pytorch实现可视化中间层的结果
2019/12/30 Python
Python 中如何写注释
2020/08/28 Python
css3 border-radius属性详解
2017/07/05 HTML / CSS
细说CSS3中box属性中的overflow-x属性和overflow-y属性值的效果
2014/07/21 HTML / CSS
关于解决iframe标签嵌套问题的解决方法
2020/03/04 HTML / CSS
美国在线医疗分销商:MedEx Supply
2020/02/04 全球购物
2014年迎新年活动方案
2014/02/19 职场文书
卫生巾广告词
2014/03/18 职场文书
专业技术职务聘任书
2014/03/29 职场文书
2014年技术部工作总结
2014/12/12 职场文书
汽车4S店销售经理岗位职责
2015/04/02 职场文书
2016年优秀共产党员先进事迹材料
2016/02/29 职场文书
pycharm2021激活码使用教程(永久激活亲测可用)
2021/03/30 Python
Nginx+Tomcat负载均衡多实例详解
2022/04/11 Servers