JavaScript中消除闭包的一般方法介绍
作者:bea
JavaScript 的闭包是一个其主动发展的特性, 也是一个被动发展的特性. 也就是说, 一方面, JS 有了闭包能更好解决一些问题. 另一方面, JS 为了解决某些问题, 而不得不使用闭包勉强来解决问题. 前者这里不讨论, 如果 JS 闭包能更好的解决问题, 当然使用闭包更好. 我讨论的是后者, 是因为 JS 本身的限制, 而不得不磕磕绊绊地用闭包来解决的问题, 例如"变量只初始化一次"这样的需求. 常规的语言这样解决: 代码如下: class Class{ fu
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();
因为后者的可扩展性更好. 当你需要实现对一个变量的不同操作时, 后一种可以只需要再定义一个不同的函数(也就是简单线性扩展), 而前一种(闭包)则需要完全重写(这就是为什么你经常听到重构这个词的原因).
有用 | 无用
前者这里不讨论, 如果 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();
因为后者的可扩展性更好. 当你需要实现对一个变量的不同操作时, 后一种可以只需要再定义一个不同的函数(也就是简单线性扩展), 而前一种(闭包)则需要完全重写(这就是为什么你经常听到重构这个词的原因).
有用 | 无用
猜你喜欢
您可能感兴趣的文章:
- 多个jQuery版本共存的处理方案
- jquery通过closest选择器修改上级元素的方法
- jQuery判断元素上是否绑定了指定事件的方法
- jQuery验证元素是否为空的两种常用方法
- jQuery在ul中显示某个li索引号的方法
- jQuery支持动态参数将函数绑定到事件上的方法
- jQuery实现预加载图片的方法
- jQuery检测鼠标左键和右键点击的方法
- jQuery对指定元素中指定字符串进行替换的方法
- jQuery经过一段时间自动隐藏指定元素的方法
- input输入框鼠标焦点提示信息
- 原生JS实现LOADING效果
- 使用jQuery实现图片遮罩半透明坠落遮挡
- jQuery+css3动画属性制作猎豹浏览器宽屏banner焦点图
- JavaScript中使用Callback控制流程介绍
- jquery图片切换插件
- JavaScript中的方法重载实例
- jquery中attr和prop的区别分析
- JavaScript中扩展Array contains方法实例