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

4

2 回答 2

2

这是怎么回事。。

在第一个中,你在函数的 END 处有 (),所以函数被执行,return 语句存储在“var Gadget”中。return 语句是您拥有的构造函数 - 一个函数。所以现在,当您执行 new Gadget() 时,您正在执行该函数。IE,马上执行外部函数,设置counter=0,然后内部函数返回到变量Gadget,每次运行,计数器递增。

然而,在第二个中,您将“外部”函数存储到“var Gadget”中,但在该函数内部,您执行内部函数。所以当你创建一个新的小工具时,计数器设置为零,然后声明返回函数然后执行,因为它后面的 (),因此递增计数器,它只是设置为 0,因此它变为 1。

我希望这是有道理的。当您定义一个函数并将其存储在 var 中时,该函数尚未执行。它在您“执行” var 时执行,例如var(). 但是如果后面有 (),它会作为函数执行,并且它返回的任何内容都会存储到 var 中。

事实上,在第一个代码中,g1、g2 和 g3 都将是对同一个内部函数的引用,而在第二个代码中,g1、g2 和 g3 将是对 Gadget 函数的引用,正如您所期望的那样,但是随后内部函数将进行评估并且不返回任何内容。

于 2012-04-29T07:58:56.840 回答
0

在第一种情况下,您立即调用返回另一个函数(内部闭包)的函数表达式,该函数被设置为变量Gadget,并且当您随后调用new Gadget() 该函数时,就好像它是一个构造函数一样调用该函数。

您可以看到这是Gadget在 Chrome 控制台中评估的第一个版本:

> Gadget
function () {
    console.log(counter += 1);
}

这个函数是一个绑定到外部(立即调用)函数的闭包,因此它们共享相同的变量Gadget实例。counter

于 2012-04-29T07:59:55.830 回答