Object实例和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
答案 0 :(得分:0)
从技术上讲,在JavaScript中,所有函数都是闭包。 (从语义上讲,你可以说它们只是在引用其局部范围之外的变量时才这样做。)
这种情况的唯一区别是函数是否是构造函数。当您说new multiplier(2)
时,您正在指示语言使用单个参数调用multiplier
函数,而是使用this
(上下文变量)将其设置为带有原型的新对象这引用了multiplier
。
在这两种情况下,你都有一个功能,两者在JavaScript看到它们方面没有任何真正的区别。您可以在没有new
的情况下调用构造函数(但是不应该,因为this
将引用其他内容,您将会破坏它。)
我倾向于遵循Douglas Crockford关于这个主题的建议,而我从不使用new
。编写 power constructors 的错误更少 - 这些函数自己创建对象并返回它们,而不是期望语言在函数调用之前创建对象:
function multiplier2(factor) {
var that = {};
that.do = function(number) {
return factor * number;
};
return that;
}
var twice2 = multiplier2(2);
console.log(twice2.do(2)); // --> 4