对象实例vs闭包
Object instance vs Closure
对象实例和闭包的区别是什么?
我什么时候应该使用另一个?有什么不同吗?
我正在考虑这个:
// closure (?)
function multiplier(factor) {
return function(number) {
return factor * number;
};
}
// I shouldnt use "new" here right?
var twice = multiplier(2);
console.log(twice(2)); // --> 4
var tripple = multiplier(3);
console.log(tripple(2)); // --> 6
// object instance (?)
function multiplier2(factor) {
this.do = function(number) {
return factor * number;
};
}
var twice2 = new multiplier2(2);
console.log(twice2.do(2)); // --> 4
var tripple2 = new multiplier2(3);
console.log(tripple2.do(2)); // --> 6
从技术上讲,JavaScript中所有函数都是闭包。(从语义上讲,你可以认为它们只有在引用局部作用域之外的变量时才是。)
在这种情况下唯一的区别是该函数是否是构造函数。当你说new multiplier(2)
时,你是在指示语言用单个参数调用multiplier
函数,但是在调用它时,this
(上下文变量)设置为一个新对象,其原型指向multiplier
。
在这两种情况下,你都有一个函数,在JavaScript如何看待它们方面,两者之间没有任何真正的区别。您可以在没有new
的情况下调用构造函数(但是不应该,因为this
将引用其他内容,而您将删除这些内容)。
我倾向于遵循Douglas Crockford关于这个话题的建议,我从不使用new
。编写功能构造函数——自己创建对象并返回对象的函数,而不是期望语言在函数调用之前创建对象,这样更不容易出错:
function multiplier2(factor) {
var that = {};
that.do = function(number) {
return factor * number;
};
return that;
}
var twice2 = multiplier2(2);
console.log(twice2.do(2)); // --> 4
相关文章:
- 在underscorejs模板中使用闭包
- setTimeout可以与闭包内的函数一起使用吗
- 附加到原型属性的Do函数没有闭包
- 使用闭包共享构造函数参数
- 使用Google闭包编译器包含一个Ecmascript 6类
- 从js引擎的角度来看闭包和构造函数是如何工作的
- for循环中的JavaScript闭包
- Javascript闭包-如何防止内存泄漏
- 子类访问父类's闭包变量
- 闭包如何具体化数据封装
- Javascript.闭包和dynamic'这'实际上具有约束力
- 构造函数函数闭包变量
- 闭包js框架-将ArrayBuffer转换为字符串
- 如何在Angularjs中重构闭包中的重复代码
- 如何告诉闭包javascript编译器不要混淆webkitAudioContext的方法名称
- Google闭包和生成的getters/ssetter
- 如何冻结函数's在闭包中的变量
- 如何使用外部Javascript库(如jQuery)重命名Google闭包样式表
- 使变量可用于不带闭包的异步调用
- 对象实例vs闭包