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学习笔记2 函数
Jan 11 Javascript
JavaScript基本数据类型及值类型和引用类型
Aug 25 Javascript
JS+CSS实现大气的黑色首页导航菜单效果代码
Sep 10 Javascript
第四篇Bootstrap网格系统偏移列和嵌套列
Jun 21 Javascript
js插件Jcrop自定义截取图片功能
Oct 14 Javascript
JS实现css hover操作的方法示例
Apr 07 Javascript
vue深入解析之render function code详解
Jul 18 Javascript
Nuxt升级2.0.0时出现的问题(小结)
Oct 08 Javascript
laydate如何根据开始时间或者结束时间限制范围
Nov 15 Javascript
详解auto-vue-file:一个自动创建vue组件的包
Apr 26 Javascript
详解Nuxt.js中使用Element-UI填坑
Sep 06 Javascript
vue实现自定义多选按钮
Jul 16 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中使用Imagick实现图像直方图的实现代码
2011/08/30 PHP
PHP生成各种常见验证码和Ajax验证过程
2016/01/10 PHP
php断点续传之文件分割合并详解
2016/12/13 PHP
Laravel框架源码解析之反射的使用详解
2020/05/14 PHP
实例讲解PHP表单
2020/06/10 PHP
jquery遍历checkbox介绍
2014/02/21 Javascript
jQuery获取DOM节点实例分析(2种方式)
2015/12/15 Javascript
Vue.js第四天学习笔记
2016/12/02 Javascript
jQuery EasyUI ProgressBar进度条组件
2017/02/28 Javascript
详解nodejs通过代理(proxy)发送http请求(request)
2017/09/22 NodeJs
iview在vue-cli3如何按需加载的方法
2018/10/31 Javascript
JavaScript实现页面中录音功能的方法
2019/06/04 Javascript
vue学习笔记之Vue中css动画原理简单示例
2020/02/29 Javascript
详解Vue中的Props与Data细微差别
2020/03/02 Javascript
JS实现简易贪吃蛇游戏
2020/08/24 Javascript
JS中箭头函数与this的写法和理解
2021/01/14 Javascript
python实现划词翻译
2020/04/23 Python
python持久性管理pickle模块详细介绍
2015/02/18 Python
python使用循环打印所有三位数水仙花数的实例
2018/11/13 Python
Python多版本开发环境管理工具介绍
2019/07/03 Python
使用pyshp包进行shapefile文件修改的例子
2019/12/06 Python
python不使用for计算两组、多个矩形两两间的iou方式
2020/01/18 Python
Python实现钉钉/企业微信自动打卡的示例代码
2021/02/02 Python
HTML5之SVG 2D入门12—SVG DOM及DOM操作介绍
2013/01/30 HTML / CSS
Html+Css+Jquery实现左侧滑动拉伸导航菜单栏的示例代码
2020/03/17 HTML / CSS
Vertbaudet西班牙网上商店:婴儿服装、童装、母婴用品和儿童家具
2019/10/16 全球购物
Swanson中国官网:美国斯旺森健康产品公司
2021/03/01 全球购物
新郎父亲婚宴答谢词
2014/01/11 职场文书
食品安全检查制度
2014/02/03 职场文书
2014年幼儿园植树节活动方案
2014/03/02 职场文书
乡镇党的群众路线对照检查材料
2014/09/24 职场文书
2019邀请函格式及范文
2019/05/20 职场文书
2019教师的学习计划
2019/06/25 职场文书
Python进阶学习之带你探寻Python类的鼻祖-元类
2021/05/08 Python
十大冰系宝可梦排名,颜值最高的阿罗拉九尾,第三使用率第一
2022/03/18 日漫
在虚拟机中安装windows server 2008的图文教程
2022/06/28 Servers