【发布时间】:2012-01-04 03:03:51
【问题描述】:
假设我有以下内容:
var foo = (function(){
var bar = 0;
return {
getBar: function(){
return bar;
},
addOne: function(){
bar++;
},
addRandom: function(rand){
bar += rand;
}
}
})();
我有以下几点:
var foo2 = function(){
var bar = 0;
this.getBar = function(){
return bar;
};
this.addOne = function(){
bar++;
};
this.addRandom = function(rand){
bar += rand;
}
};
执行函数的唯一区别是new吗?
alert(foo.getBar()); //0
foo.addOne();
foo.addRandom(32);
alert(foo.getBar()); //33
var foo2_obj = new foo2;
alert(foo2_obj.getBar());//0
foo2_obj.addOne();
foo2_obj.addRandom(32);
alert(foo2_obj.getBar());//33
他们都输出了完全相同的东西。
那么从长远来看有什么区别呢?
一个人能做什么,另一个人不能?
上述的小提琴演示:http://jsfiddle.net/maniator/YtBpe/
【问题讨论】:
-
一句话:一是对象,二是函数。
-
从纯粹的程序化角度关注可以完成和不能完成的事情是不正确的。 JavaScript 的语言设计,就像所有的代码一样都是不完美的。特别是考虑到原始设计的匆忙时间表。因此,专注于最佳实践。 new 通常用于构造函数调用模式(Crockford 认为这是一件坏事)。它设置 this = 原型对象。它还以有趣的方式修改方法的返回值。因此,构造函数应该大写以表示其预期用途。
-
您的示例无关紧要,因为它们没有更大的上下文而存在。如果你想谈论闭包,你必须谈论跨越范围边界以及在上下文中的结果。
-
'foo' 将运行一次并生成一个对象。 'foo2' 可以与 'new' 一起运行,以创建任意数量的对象。就像布赖恩说的,将 'Foo2' 大写。
标签: javascript object closures