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 操作css样式、位置、尺寸方法汇总
Nov 28 Javascript
每天一篇javascript学习小结(Boolean对象)
Nov 12 Javascript
高效Web开发的10个jQuery代码片段
Jul 22 Javascript
对js中回调函数的一些看法
Aug 29 Javascript
bootstrap中使用google prettify让代码高亮的方法
Oct 21 Javascript
vue.js学习之递归组件
Dec 13 Javascript
原生js实现新闻列表展开/收起全文功能
Jan 20 Javascript
JS优化与惰性载入函数实例分析
Apr 06 Javascript
解析Angular 2+ 样式绑定方式
Jan 15 Javascript
React如何解决fetch跨域请求时session失效问题
Nov 02 Javascript
Layui Form 自定义验证的实例代码
Sep 14 Javascript
JS加载解析Markdown文档过程详解
May 19 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
现磨咖啡骗局!现磨咖啡=新鲜咖啡?现磨咖啡背后的猫腻你不懂!
2019/03/28 冲泡冲煮
php递归获取目录内文件(包含子目录)封装类分享
2013/12/25 PHP
php抽象类使用要点与注意事项分析
2015/02/09 PHP
php+ajax无刷新上传图片实例代码
2015/11/17 PHP
PHP实现微信小程序人脸识别刷脸登录功能
2018/05/24 PHP
PHPUnit测试私有属性和方法功能示例
2018/06/12 PHP
jQuery 学习6 操纵元素显示效果的函数
2010/02/07 Javascript
JavaScript访问样式表代码
2010/10/15 Javascript
多浏览器兼容性比较好的复制到剪贴板的js代码
2011/10/09 Javascript
JavaScript实现随机替换图片的方法
2015/04/16 Javascript
原生JS封装ajax 传json,str,excel文件上传提交表单(推荐)
2016/06/21 Javascript
原生js开发的日历插件
2017/02/04 Javascript
angularjs封装$http为factory的方法
2017/05/18 Javascript
Windows下使用Nodejs运行js的方法
2017/09/02 NodeJs
React优化子组件render的使用
2019/05/12 Javascript
jQuery/JS监听input输入框值变化实例
2019/10/17 jQuery
React 实现车牌键盘的示例代码
2019/12/20 Javascript
javascript实现滚动条效果
2020/03/24 Javascript
jQuery zTree如何改变指定节点文本样式
2020/10/16 jQuery
Python3.0与2.X版本的区别实例分析
2014/08/25 Python
Python中给List添加元素的4种方法分享
2014/11/28 Python
对python GUI实现完美进度条的示例详解
2018/12/13 Python
django多对多表的创建,级联删除及手动创建第三张表
2019/07/25 Python
python GUI库图形界面开发之PyQt5简单绘图板实例与代码分析
2020/03/08 Python
快速解决jupyter启动卡死的问题
2020/04/10 Python
在jupyter notebook中调用.ipynb文件方式
2020/04/14 Python
Python计算信息熵实例
2020/06/18 Python
泰国在线书店:SE-ED
2020/06/21 全球购物
车间调度岗位职责
2013/11/30 职场文书
主题酒店策划书
2014/01/28 职场文书
运动会广播稿200字(10篇)
2014/10/12 职场文书
开展党的群众路线教育实践活动个人对照检查材料
2014/11/05 职场文书
Ajax是什么?Ajax高级用法之Axios技术
2021/04/21 Javascript
千万级用户系统SQL调优实战分享
2022/03/03 MySQL
解决Windows Server2012 R2 无法安装 .NET Framework 3.5
2022/04/29 Servers
MySQL外键约束(Foreign Key)案例详解
2022/06/28 MySQL