2011-04-26 119 views
4

閉包是 函數的局部變量 - 在 函數返回後保持活動狀態。關閉JS閉包

我正在圍繞着JS & jQuery Closures。根據上面的定義,我的理解是閉包允許訪問函數之外的變量,而不需要創建全局變量,從而消除了固有風險。我的解釋是否正確?

一如既往地多謝。

回答

4

通常你會認爲,當你定義一個函數foo唯一可能的變量,它可以讀/寫你定義你傳遞給函數時,它被稱爲foo(1, "hello");的參數和所有的global變量。這就是C語言的工作原理。

的JavaScript然而,你可以定義一個函數幾乎任何地方比全球和參數變量和其他功能還可以在其父作用域讀/寫變量;例如:

var global = "global"; 
function foo() { 
    var one = 1; 
    function bar() { 
     var two = 2; 
     function argh() { 
     } 
    } 
} 

功能argh將能夠讀取/所有其父作用域寫變量,在這種情況下twooneglobal都對功能argh訪問。

我希望這能更好地解釋閉包的含義 - 一旦你在JavaSript的工作範圍內工作,這並不難。閉包基本上只是能夠訪問當前和父級範圍的內部函數...... :)。

這是一個相當強大的概念,特別是當你在做異步的事情。想象一下,自己有定義將在不同的時刻運行的函數:

// the function we defined below 
// will run in 5 seconds in time 
setTimeout(function(){ 

}, 5000); 

沒有的JavaScript函數來訪問父範圍,我們只能夠訪問全球變量的能力。但是用JavaScript這是很容易,我們可以使用所有可用的本地變量:

var foo = "some local variable"; 
setTimeout(function(){ 
    alert(foo); 
}, 5000); 
1

技術上是的。實際上不,它們要複雜得多,而且你用這個語法來描述它們的事實表明你對這個概念的理解很差。在您訪問了Robert Harvey的鏈接後,我會回到引用的來源。

+0

同樣值得一讀[道格拉斯克羅克福德的文章](http://javascript.crockford.com/) – NT3RP 2011-04-26 16:29:35

+0

謝謝,我會繼續我的研究。 – Wasabi 2011-04-28 04:30:39

0

下面是一個使用閉包的一個很好的例子:

function makeAddFunction(number1){ 
    function add(number2){ 
     return number1 + number2; 
    } 
    return add; 
} 

var add2 = makeAddFunction(2); 
var add5 = makeAddFunction(5); 
console.log(add2(2)); //Will print 4 to the console 
console.log(add5(2)); //Will print 7 to the console 
console.log(add2(1)); //Will print 3 to the console 

我發現,最好的辦法理解這概念就是說,當你調用makeAddFunction()並且在這種情況下將它存儲在變量add2中時,你正在拍攝外部函數數據/狀態的快照。然後當你調用你的新函數add2()時,你正在訪問那些數據以及傳遞給add2()作爲參數的數據。新的參數在函數返回後死亡,但原始快照仍在那裏用新的參數再次調用。