var Gadget = function () {
// static variable/property
var counter = 0;
// returning the new implementation
// of the constructor
return function () {
console.log(counter += 1);
};
}(); // execute immediately
var g1 = new Gadget(); // logs 1
var g2 = new Gadget(); // logs 2
var g3 = new Gadget(); // logs 3
我调试了此代码,var counter = 0;
期间不会执行new Gadget()
,输出为1,2,3
。
var Gadget = function () {
// static variable/property
var counter = 0;
// returning the new implementation
// of the constructor
return function () {
console.log(counter += 1);
}();
}; // execute immediately
var g1 = new Gadget(); // logs 1
var g2 = new Gadget(); // logs 2
var g3 = new Gadget(); // logs 3
我调试此代码var counter = 0;
将在new Gadget()
期间执行,输出为1,1,1
。
这个演示代码是javascript模式,私有静态成员。理解这一点我有点麻烦。
答案 0 :(得分:2)
这是怎么回事......
在第一个中,函数的END处有(),因此执行函数,并将return语句存储在“var Gadget”中。 return语句是你拥有的构造函数 - 一个函数。所以现在,当你执行新的Gadget()时,你正在执行该功能。 IE,外部函数立即执行,设置counter = 0,然后内部函数返回到变量Gadget,每次运行时,它都会递增计数器。
然而,在第二个中,您将“外部”函数存储到“var Gadget”中,但在该函数内部,您执行内部函数。因此,当你创建一个新的小工具时,计数器被设置为零,然后声明返回函数,然后由于它之后的()而执行,因此递增计数器,它必须设置为0,因此它变为1。
我希望这是有道理的。定义函数并将其存储在var中时,该函数尚未执行。它是在你“执行”var时执行的,例如var()
。但是如果你之后有一个(),它就作为一个函数执行,无论它返回什么存储到var中。
实际上,在第一个代码中,g1,g2和g3都将引用相同的内部函数,而在第二个代码中,g1,g2和g3将引用Gadget函数,正如您所期望的那样,但是内部函数将进行评估并且不返回任何内容。
答案 1 :(得分:0)
在第一种情况下,你立即调用函数表达式,其中返回另一个函数(内部闭包),它被设置为变量Gadget
,当你随后调用{{1 该函数被调用,好像它是一个构造函数。
您可以看到这是在Chrome控制台中评估new Gadget()
的第一个版本:
Gadget
此函数是绑定到外部(立即调用的)> Gadget
function () {
console.log(counter += 1);
}
函数的闭包,因此它们共享Gadget
变量的相同实例。