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 :nth-child前有无空格的区别分析
Jul 11 Javascript
jquery移除button的inline onclick事件(已测试及兼容浏览器)
Jan 25 Javascript
JS注册/移除事件处理程序(ExtJS应用程序设计实战)
May 07 Javascript
Jquery事件的连接使用示例
Jun 18 Javascript
javascript loadScript异步加载脚本示例讲解
Nov 14 Javascript
如何实现修改密码时密码框显示保存到cookie的密码
Dec 10 Javascript
jquery实现文本框的禁用和启用
Dec 07 Javascript
ajax分页效果(bootstrap模态框)
Jan 23 Javascript
JavaScript表单验证实现代码
May 22 Javascript
微信小程序实现倒计时60s获取验证码
Apr 17 Javascript
js装饰设计模式学习心得
Feb 17 Javascript
Javascript模块化机制实现原理详解
Apr 02 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 面向对象实现代码
2009/11/11 PHP
PHP实现删除字符串中任何字符的函数
2015/08/11 PHP
理清PHP在Linxu下执行时的文件权限方法
2017/06/07 PHP
PHP中16个高危函数整理
2019/09/19 PHP
Jquery焦点图实例代码
2014/11/25 Javascript
node.js中的fs.fchmod方法使用说明
2014/12/16 Javascript
jQuery使用fadein方法实现渐出效果实例
2015/03/27 Javascript
javascript中new关键字详解
2015/12/14 Javascript
Bootstrap表单控件学习使用
2017/03/07 Javascript
在node中如何使用 ES6
2017/04/22 Javascript
微信小程序 支付功能(前端)的实现
2017/05/24 Javascript
Vue中计算属性computed的示例解读
2017/07/26 Javascript
AngularJS实现的鼠标拖动画矩形框示例【可兼容IE8】
2019/05/17 Javascript
Node.js学习教程之Module模块
2019/09/03 Javascript
vue中axios防止多次触发终止多次请求的示例代码(防抖)
2020/02/16 Javascript
Node.js 中判断一个文件是否存在
2020/08/24 Javascript
[02:23]2014DOTA2国际邀请赛中国战队回顾
2014/08/01 DOTA
部署Python的框架下的web app的详细教程
2015/04/30 Python
python安装cx_Oracle模块常见问题与解决方法
2017/02/21 Python
python利用多种方式来统计词频(单词个数)
2019/05/27 Python
Python实现计算图像RGB均值方式
2020/06/04 Python
获取python运行输出的数据并解析存为dataFrame实例
2020/07/07 Python
如何在windows下安装配置python工具Ulipad
2020/10/27 Python
css3实现可拖动的魔方3d效果
2019/05/07 HTML / CSS
AVON雅芳官网:世界上最大的美容化妆品公司之一
2016/11/02 全球购物
德国网上宠物店:Zoobio
2018/05/23 全球购物
英国领先的豪华时尚家居网上商店:Amara
2019/08/12 全球购物
日本即尚网:JSHOPPERS.com(支持中文)
2019/12/03 全球购物
Steiff台湾官网:德国金耳釦泰迪熊
2019/12/26 全球购物
节能减排倡议书
2014/04/15 职场文书
中班教师个人总结
2015/02/05 职场文书
小学见习报告
2015/06/23 职场文书
2015初中团支部工作总结
2015/07/21 职场文书
Python 如何解决稀疏矩阵运算
2021/05/26 Python
MySQL中distinct和count(*)的使用方法比较
2021/05/26 MySQL
手写Spirit防抖函数underscore和节流函数lodash
2022/03/22 Javascript