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 flash激活
Oct 19 Javascript
jquery dialog键盘事件代码
Aug 01 Javascript
jQuery EasyUI datagrid实现本地分页的方法
Feb 13 Javascript
Javascript农历与公历相互转换的简单实例
Oct 09 Javascript
基于JavaScript实现轮播图原理及示例
Apr 10 Javascript
JS区分Object与Aarry的六种方法总结
Feb 27 Javascript
详解Vue中过度动画效果应用
May 25 Javascript
weex里Vuex state使用storage持久化详解
Sep 09 Javascript
JavaScript中重名的函数与对象示例详析
Sep 28 Javascript
angular实现页面打印局部功能的思考与方法
Apr 13 Javascript
React组件重构之嵌套+继承及高阶组件详解
Jul 19 Javascript
微信 jssdk 签名错误invalid signature的解决方法
Jan 14 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性能测试工具xhprof的详解
2013/06/03 PHP
PHP curl使用实例
2015/07/02 PHP
深入理解PHP的远程多会话调试
2017/09/21 PHP
Laravel 实现数据软删除功能
2019/08/21 PHP
了解jQuery技巧来提高你的代码
2010/01/08 Javascript
jquery 学习之二 属性 文本与值(text,val)
2010/11/25 Javascript
iframe的onload在Chrome/Opera中执行两次Bug的解决方法
2011/03/17 Javascript
raphael.js绘制中国地图 地图绘制方法
2014/02/12 Javascript
javascript实现数组内值索引随机化及创建随机数组的方法
2015/08/10 Javascript
JavaScript中函数表达式和函数声明及函数声明与函数表达式的不同
2015/11/15 Javascript
jQuery实现自动调用和触发某个事件的方法
2016/11/18 Javascript
JavaScript微信定位功能实现方法
2016/11/29 Javascript
jQuery Chosen通用初始化
2017/03/07 Javascript
Vue.js实战之组件之间的数据传递
2017/04/01 Javascript
jQuery中animate()的使用方法及解决$(”body“).animate({“scrollTop”:top})不被Firefox支持的问题
2017/04/04 jQuery
JS判断非空至少输入两个字符的简单实现方法
2017/06/23 Javascript
jquery实现侧边栏左右伸缩效果的示例
2017/12/19 jQuery
JS执行控制之节流模式实例分析
2018/12/21 Javascript
Vue路由切换页面不更新问题解决方案
2020/07/10 Javascript
vue中实现弹出层动画效果的示例代码
2020/09/25 Javascript
[01:55]2014DOTA2国际邀请赛 BBC正赛第一天总结
2014/07/10 DOTA
Python命令行参数解析模块optparse使用实例
2015/04/13 Python
python生成器与迭代器详解
2019/01/01 Python
详解如何从TensorFlow的mnist数据集导出手写体数字图片
2019/08/05 Python
Python实现PyPDF2处理PDF文件的方法示例
2019/09/25 Python
Python FTP文件定时自动下载实现过程解析
2019/11/12 Python
Python Tkinter模块 GUI 可视化实例
2019/11/20 Python
解决python 在for循环并且pop数组的时候会跳过某些元素的问题
2020/12/11 Python
利用简洁的图片预加载组件提升html5移动页面的用户体验
2016/03/11 HTML / CSS
希特勒经典演讲稿
2014/05/19 职场文书
硕士生找工作求职信
2014/07/05 职场文书
租赁协议书
2015/01/27 职场文书
培训班通知
2015/04/25 职场文书
呐喊读书笔记
2015/06/30 职场文书
python numpy中setdiff1d的用法说明
2021/04/22 Python
Go语言安装并操作redis的go-redis库
2022/04/14 Golang