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 相关文章推荐
document对象execCommand的command参数介绍
Aug 01 Javascript
jQuery 选择器详解
Jan 19 Javascript
BootStrap实用代码片段之一
Mar 22 Javascript
深入理解Ajax的get和post请求
Jun 02 Javascript
点击按钮出现60秒倒计时的简单js代码(推荐)
Jun 07 Javascript
js注入 黑客之路必备!
Sep 14 Javascript
vue mint-ui学习笔记之picker的使用
Oct 11 Javascript
详解最新vue-cli 2.9.1的webpack存在问题
Dec 16 Javascript
JS执行控制之节流模式实例分析
Dec 21 Javascript
mpvue小程序循环动画开启暂停的实现方法
May 15 Javascript
layer弹出层自定义提交取消按钮的例子
Sep 10 Javascript
用JS实现选项卡
Mar 23 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 substr 截取字符串出现乱码问题解决方法[utf8与gb2312]
2011/12/16 PHP
PHP备份数据库生成SQL文件并下载的函数代码
2012/02/05 PHP
apache php模块整合操作指南
2012/11/16 PHP
获取PHP警告错误信息的解决方法
2013/06/03 PHP
PHP日期函数date格式化UNIX时间的方法
2015/03/19 PHP
thinkPHP5框架auth权限控制类与用法示例
2018/06/12 PHP
50个优秀经典PHP算法大集合 附源码
2020/08/26 PHP
关于文本限制字数的js代码
2007/04/02 Javascript
利用javascript实现禁用网页上所有文本框,下拉菜单,多行文本域
2013/12/14 Javascript
常用jQuery选择器总结
2014/07/11 Javascript
深入理解jquery自定义动画animate()
2016/05/24 Javascript
浅谈JavaScript变量的自动转换和语句
2016/06/12 Javascript
基于javascript实现按圆形排列DIV元素(二)
2016/12/02 Javascript
解析Vue 2.5的Diff算法
2017/11/28 Javascript
详解webpack运行Babel教程
2018/06/13 Javascript
vue 弹框产生的滚动穿透问题的解决
2018/09/21 Javascript
vue项目中使用fetch的实现方法
2019/04/25 Javascript
浅谈Express.js解析Post数据类型的正确姿势
2019/05/30 Javascript
亲自动手实现vue日历控件
2019/06/26 Javascript
[00:32]DOTA2上海特级锦标赛 Ehome战队宣传片
2016/03/03 DOTA
python实现在无须过多援引的情况下创建字典的方法
2014/09/25 Python
如何在sae中设置django,让sae的工作环境跟本地python环境一致
2017/11/21 Python
浅谈Python3 numpy.ptp()最大值与最小值的差
2019/08/24 Python
教你使用Sublime text3搭建Python开发环境及常用插件安装另分享Sublime text3最新激活注册码
2020/11/12 Python
python中字符串的编码与解码详析
2020/12/03 Python
pytorch Dataset,DataLoader产生自定义的训练数据案例
2021/03/03 Python
使用css3实现超炫的loading加载动画效果
2014/05/07 HTML / CSS
亚瑟士美国官网:ASICS美国
2017/02/01 全球购物
现代家居用品及礼品:LBC Modern
2018/06/24 全球购物
Ivory Isle Designs美国/加拿大:婚礼和活动文具公司
2018/08/21 全球购物
中专毕业生自我鉴定
2013/11/21 职场文书
预备党员思想汇报范文
2014/01/11 职场文书
挂科检讨书范文
2014/02/20 职场文书
安全大检查实施方案
2014/02/22 职场文书
中秋节主持词
2014/04/02 职场文书
2014年财务人员工作总结
2014/11/11 职场文书