js立即函数exec序列

时间:2012-04-29 07:46:15

标签: javascript

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模式,私有静态成员。理解这一点我有点麻烦。

2 个答案:

答案 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变量的相同实例。