对象实例vs闭包

Object instance vs Closure

本文关键字:闭包 vs 实例 对象      更新时间:2023-09-26

对象实例和闭包的区别是什么?

我什么时候应该使用另一个?有什么不同吗?

我正在考虑这个:

// 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