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 相关文章推荐
window.location.hash 属性使用说明
Mar 20 Javascript
鼠标事件延时切换插件
Mar 12 Javascript
Javascript 按位取反运算符 (~)
Feb 04 Javascript
JavaScript的strict模式与with关键字介绍
Feb 08 Javascript
用js判断输入是否为中文的函数
Mar 10 Javascript
浅谈重写window对象的方法
Dec 29 Javascript
JS选项卡动态替换banner图片路径的方法
May 11 Javascript
简单讲解jQuery中的子元素过滤选择器
Apr 18 Javascript
servlet+jquery实现文件上传进度条示例代码
Jan 25 Javascript
VUE安装使用教程详解
Jun 03 Javascript
更优雅的微信小程序骨架屏实现详解
Aug 07 Javascript
JS异步宏队列微队列原理详解
Sep 09 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获得当前的脚本网址
2007/12/10 PHP
五个PHP程序员工具
2008/05/26 PHP
PHP set_time_limit(0)长连接的实现分析
2010/03/02 PHP
php发送与接收流文件的方法
2015/02/11 PHP
简单谈谈PHP中的include、include_once、require以及require_once语句
2016/04/23 PHP
浅谈PHP发送HTTP请求的几种方式
2017/07/25 PHP
插件:检测javascript的内存泄漏
2007/03/04 Javascript
js和html5实现手机端刮刮卡抽奖效果完美兼容android/IOS
2013/11/18 Javascript
JavaScript DOM节点添加示例
2014/07/16 Javascript
jQuery检测滚动条是否到达底部
2015/12/15 Javascript
jquery插件autocomplete用法示例
2016/07/01 Javascript
vue2.0使用Sortable.js实现的拖拽功能示例
2017/02/21 Javascript
Bootstrap模态框插入视频的实现代码
2017/06/25 Javascript
AngularJs 延时器、计时器实例代码
2017/09/16 Javascript
bootstrap表格内容过长时用省略号表示的解决方法
2017/11/21 Javascript
Vue Element使用icon图标教程详解(第三方)
2018/02/07 Javascript
layui-select动态选中值的例子
2019/09/23 Javascript
JS获取表格视图所选行号的ids过程解析
2020/02/21 Javascript
jQuery+css实现的点击图片放大缩小预览功能示例【图片预览 查看大图】
2020/05/29 jQuery
JavaScript 声明私有变量的两种方式
2021/02/05 Javascript
[00:32]2018DOTA2亚洲邀请赛出场——LGD
2018/04/04 DOTA
python实现将文本转换成语音的方法
2015/05/28 Python
python中matplotlib实现最小二乘法拟合的过程详解
2017/07/11 Python
python清除函数占用的内存方法
2018/06/25 Python
Python封装原理与实现方法详解
2018/08/28 Python
Python学习笔记之抓取某只基金历史净值数据实战案例
2019/06/03 Python
基于django ManyToMany 使用的注意事项详解
2019/08/09 Python
python实现图片压缩代码实例
2019/08/12 Python
Python logging模块异步线程写日志实现过程解析
2020/06/30 Python
英国奢侈品网站:MatchesFashion
2016/12/16 全球购物
英国最大的在线时尚眼镜店:Eyewearbrands
2019/03/12 全球购物
最新党员思想汇报
2014/01/01 职场文书
服务口号大全
2014/06/11 职场文书
法人委托书范本
2014/09/15 职场文书
学生会任命书范本
2015/09/21 职场文书
Nginx 常用配置
2022/05/15 Servers