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 Mobile入门—外部链接切换示例代码
Jan 08 Javascript
JS this作用域以及GET传输值过长的问题解决方法
Aug 06 Javascript
JS获取图片lowsrc属性的方法
Apr 01 Javascript
jq实现左侧显示图片右侧文字滑动切换效果
Aug 04 Javascript
JSONP和批量操作功能的实现方法
Aug 21 Javascript
深入理解jQuery.data() 的实现方式
Nov 30 Javascript
详解vue2父组件传递props异步数据到子组件的问题
Jun 29 Javascript
使用Vue.js开发微信小程序开源框架mpvue解析
Mar 20 Javascript
vue接口请求加密实例
Aug 11 Javascript
js实现网页随机验证码
Oct 19 Javascript
详解Vue 的异常处理机制
Nov 30 Vue.js
vue实现简单数据双向绑定
Apr 28 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
人大复印资料处理程序_输入篇
2006/10/09 PHP
php下安装配置fckeditor编辑器的方法
2011/03/02 PHP
解析php获取字符串的编码格式的方法(函数)
2013/06/21 PHP
PHP实现的json类实例
2015/07/28 PHP
CI框架数据库查询缓存优化的方法
2016/11/21 PHP
老生常谈PHP面向对象之注册表模式
2017/05/26 PHP
php注册系统和使用Xajax即时验证用户名是否被占用
2017/08/31 PHP
PHP序列化的四种实现方法与横向对比
2018/11/29 PHP
浅谈laravel aliases别名的原理
2019/10/24 PHP
laravel框架实现敏感词汇过滤功能示例
2020/02/15 PHP
用htc组件制作windows选项卡
2007/01/13 Javascript
jQuery选择头像并实时显示的代码
2010/06/27 Javascript
深入理解jQuery中live与bind方法的区别
2013/12/18 Javascript
jQuery实现的类似淘宝网站搜索框样式代码分享
2015/08/24 Javascript
JS简单去除数组中重复项的方法
2016/09/13 Javascript
js实现HashTable(哈希表)的实例分析
2016/11/21 Javascript
Vue.js 中取得后台原生HTML字符串 原样显示问题的解决方法
2018/06/10 Javascript
vue-cli 3.0 自定义vue.config.js文件,多页构建的方法
2018/09/19 Javascript
JS桶排序的简单理解与实现方法示例
2019/11/25 Javascript
原生javascript实现类似vue的数据绑定功能示例【观察者模式】
2020/02/24 Javascript
[01:00:59]VP VS VG Supermajor小组赛胜者组第二轮 BO3第二场 6.2
2018/06/03 DOTA
python线程池的实现实例
2013/11/18 Python
浅析python 中__name__ = '__main__' 的作用
2014/07/05 Python
Python的Django框架中模板碎片缓存简介
2015/07/24 Python
Python构造自定义方法来美化字典结构输出的示例
2016/06/16 Python
python随机取list中的元素方法
2018/04/08 Python
python实现连续图文识别
2018/12/18 Python
python实现图片上添加图片
2019/11/26 Python
Python3爬虫中pyspider的安装步骤
2020/07/29 Python
Python实现自动签到脚本功能
2020/08/20 Python
PyCharm 2020.2下配置Anaconda环境的方法步骤
2020/09/23 Python
Becextech新西兰:数码单反相机和手机在线商店
2018/04/27 全球购物
经贸专业毕业生求职信范文
2014/05/01 职场文书
科技节口号
2014/06/19 职场文书
经济类毕业生求职信
2014/06/26 职场文书
我的大学四年规划书范文2014
2014/09/26 职场文书