function generateClosure(){ var count = 0; var get = function(){ return ++count; } return get; } var counter = generateClosure(); console.log(counter()); // 1 console.log(counter()); // 2 console.log(counter()); // 3
一個函數返回它內部定義的一個函數,就產生了一個閉包,閉包不只包括被返回的函數 ,還包括這個函數的定義環境。上面例子中,generateClosure內部的函數get被外部的變量counter引用時,counter和generateClosure的局部變量就構成了一個閉包。javascript
function generateClosure(){ var count = 0; var get = function(){ return ++count; } return get; } var counter1 = generateClosure(); var counter2 = generateClosure(); console.log(counter1()); // 1 console.log(counter2()); // 1 console.log(counter1()); // 2 console.log(counter1()); // 3 console.log(counter2()); // 2
上面例子generateClosure調用了兩次,產生了兩個獨立的閉包實例,兩者的定義環境不同。能夠這樣理解,generateClosure返回get的時候,也將get能引用到的generateClosure的局部變量也返回了,並在內存中生成了一個副本。上面的例子即便把var換成let,值類型count換成對象count{value:0}必不會影響結果。java