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 相关文章推荐
Javascript代码混淆综合解决方案-Javascript在线混淆器
Dec 18 Javascript
让任务管理器中的CPU跳舞的js代码
Nov 01 Javascript
JS简单的图片放大缩小的两种方法
Nov 11 Javascript
js拖拽一些常见的思路方法整理
Mar 19 Javascript
jquery实现select下拉框美化特效代码分享
Aug 18 Javascript
JavaScript在网页中画圆的函数arc使用方法
Nov 13 Javascript
jQuery Validate插件实现表单强大的验证功能
Dec 18 Javascript
JS中input表单隐藏域及其使用方法
Feb 13 Javascript
JS实现非首屏图片延迟加载的示例
Jan 06 Javascript
深入浅析Vue中的 computed 和 watch
Jun 06 Javascript
对layui中表单元素的使用详解
Aug 15 Javascript
微信小程序自定义支持图片的弹窗
Dec 21 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设计模式 php实现单例模式(singleton)
2015/12/07 PHP
Centos7安装swoole扩展操作示例
2020/03/26 PHP
PHP设计模式(三)建造者模式Builder实例详解【创建型】
2020/05/02 PHP
PHP实现简易用户登录系统
2020/07/10 PHP
javascript for循环设法提高性能
2010/02/24 Javascript
40款非常棒的jQuery 插件和制作教程(系列二)
2011/11/02 Javascript
open 动态修改img的onclick事件示例代码
2013/11/13 Javascript
node.js中的fs.linkSync方法使用说明
2014/12/15 Javascript
jQuery中:focus选择器用法实例
2014/12/30 Javascript
详解nodejs微信公众号开发——4.自动回复各种消息
2017/04/11 NodeJs
jQuery简单绑定单个事件的方法示例
2017/06/10 jQuery
详解JS获取HTML DOM元素的8种方法
2017/06/17 Javascript
easyui-datagrid开发实践(总结)
2017/08/02 Javascript
为什么使用koa2搭建微信第三方公众平台的原因
2018/05/16 Javascript
Babel 入门教程学习笔记
2018/06/13 Javascript
Vue组件系列开发之模态框
2019/04/18 Javascript
微信小程序实现单个卡片左滑显示按钮并防止上下滑动干扰功能
2019/12/06 Javascript
微信小程序实现天气预报功能(附源码)
2020/12/10 Javascript
[06:04]DOTA2国际邀请赛纪录片:Just For LGD
2013/08/11 DOTA
[01:45:05]VGJ.T vs Newbee Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
python安装numpy和pandas的方法步骤
2019/05/27 Python
python实现大文件分割与合并
2019/07/22 Python
windows下Python安装、使用教程和Notepad++的使用教程
2019/10/06 Python
利用Tensorflow的队列多线程读取数据方式
2020/02/05 Python
如何将Pycharm中调整字体大小的方式设置为"ctrl+鼠标滚轮上下滑"
2020/11/17 Python
python批量合成bilibili的m4s缓存文件为MP4格式 ver2.5
2020/12/01 Python
万得城电器土耳其网站:欧洲第一大电子产品零售商
2016/10/07 全球购物
三星俄罗斯授权在线商店:Samsung俄罗斯
2019/09/28 全球购物
远程学习的教学用品和家庭学习资源:Really Good Stuff
2020/04/27 全球购物
如果一个类实现了多个接口但是这些接口有相同的方法名将会怎样
2013/06/16 面试题
质量提升方案
2014/06/16 职场文书
家属慰问信
2015/02/14 职场文书
自荐信怎么写
2015/03/04 职场文书
考试没考好检讨书
2015/05/06 职场文书
大学组织委员竞选稿
2015/11/21 职场文书
python spilt()分隔字符串的实现示例
2021/05/21 Python