对象实例vs Closure

时间:2014-08-06 19:04:05

标签: javascript

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

1 个答案:

答案 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