2012-04-29 25 views
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,3js的直接函數的exec序列

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模式中的私有靜態成員。我理解這一點有點麻煩。

+1

你現在的問題是什麼?爲什麼它不是在第一種情況下執行或者什麼? – 2012-04-29 07:51:17

回答

2

發生了什麼事是這樣的..

在第一個,你有()在函數的末尾,這樣的功能被執行,return語句存儲在「VAR小工具」。 return語句是你有的構造函數 - 一個函數。所以,現在,當你做新的Gadget()時,你正在執行該功能。 IE,外部函數立即執行,設置計數器= 0,然後內部函數返回到變量Gadget,並且每次運行時,它都會增加計數器。然而,在第二個函數中,將「外部」函數存儲到「var Gadget」中,但是在該函數內部執行內部函數。所以當你製作一個新的Gadget時,計數器被設置爲零,然後返回函數被聲明,然後執行,因爲它後面的(),因此遞增計數器,它被設置爲0,因此它變成1.

我希望這是有道理的。當您定義一個函數並將其存儲在一個var中時,該函數尚未執行。它在執行var時執行,例如var()。但是如果你在它之後有一個(),它會作爲一個函數被執行,並且它的任何返回都被存儲到var中。實際上,在第一個代碼中,g1,g2和g3都將引用相同的內部函數,而在第二個代碼中,g1,g2和g3將引用小工具函數,就像您期望,但內在的功能將評估和返回什麼。

+0

實際上,在第一個代碼中,g1,g2和g3都將引用相同的內部函數。我幾乎得到你說的笏。但爲什麼他們引用內部函數? – 2012-04-29 08:27:57

0

在第一種情況下,你直接調用該函數表達式,其返回另一個函數(內罩),其被設置爲可變Gadget和當您隨後調用new Gadget()發揮功能就好像它是被稱爲一個構造函數。

你可以看到這個被在Chrome控制檯評價Gadget的第一個版本:

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

此功能是綁定到外部(立即調用)Gadget功能的關閉,因此它們共享相同的實例變量counter

+0

您是指返回函數中的第一個var的構造函數。謝謝,明白這一點。 – 2012-04-29 08:30:51