Q
理解關閉示例難點
0
A
回答
0
要理解閉包,您首先需要了解範圍。範圍是變量的生命週期。在範圍內聲明的變量是天生的,當範圍結束時它會死亡。例如:
{ // scope begins
var x = 0; // variable x is born
var y = 1; // variable y is born
} // scope ends, x and y both die
現在,是保持一個變量,即使活着,它是在結束聲明的範圍後一種方式。總之,這是變數可以欺騙死亡的一種方式。變量欺騙死亡的方式是通過關閉。
考慮另一個範圍內的範圍。內部作用域可以訪問在外部作用域內聲明的所有變量。但是,外部範圍無法訪問在內部範圍內聲明的任何變量。
{ // the outer scope has access to x and y only
var x = 0;
var y = 1;
{ // the inner scope has access to x, y and z
var z = 2;
}
}
內部範圍訪問z
,因爲它是在內部範圍內聲明。但是,它也可以訪問x
和y
,因爲這兩個變量位於內部作用域的詞法環境(即父作用域)中。
現在考慮如果我們可以將這個內部作用域移到外部作用域之外會發生什麼。
{ // the outer scope has access to x and y only
var x = 0;
var y = 1;
{ // the inner scope has access to x, y and z
var z = 2;
} ---+
} |
|
{ <------+ // the inner scope moved outside of the outer scope
var z = 2;
}
在這種情況下,外部範圍結束。因此,x
和y
應與外部範圍一起死亡。但是,他們不能死亡,因爲他們仍然需要內部範圍。當內部作用域被移到外部作用域之外時,它將成爲變量x
和y
(這是它的最高值)的閉包,並且只要它自身存在,它就會保持這些變量的存活狀態。這是關閉的總體思路。
現在考慮下面的代碼:
function startAt(x) {
return incrementBy;
function incrementBy(y) {
return x + y;
}
}
var closure1 = startAt(1);
var closure2 = startAt(5);
這裏,incrementBy
函數是一個內部函數。因此,它可以訪問屬於startAt
函數的變量x
。但是,當我們從startAt
返回incrementBy
時,我們正在將外部函數外部的內部函數移動。因此,儘管x
應該已經由於startAt
的回報而死亡,但它仍然存在,因爲它需要incrementBy
。
因此,incrementBy
是一個閉包,因爲它在變量x
上關閉,並且只要它自身存在就保持活動狀態;變量x
被稱爲關閉incrementBy
的upvalue。
相關問題
- 1. 麻煩理解Javascript關閉示例
- 2. 困難時間理解javascript示例
- 3. 難點理解邏輯
- 4. 理解道場封閉示例
- 5. 關閉定義和示例
- 6. C++ 0x關閉/ lambdas示例
- 7. 使用VB.NET理解JavaScript API示例時遇到困難
- 8. 需要更多關於w3schools的解釋javascript關閉示例
- 9. 理解此遞歸的難點
- 10. Clojure理解示例
- 11. 機器如何理解1表示開啓,0表示關閉?
- 12. 理解構成Monads的理解示例
- 13. 解決例外文件關閉的StreamWriter
- 14. Javascript關閉:MDN中的實際關閉示例
- 15. Javascript關閉的實際用法/示例
- 16. 快速關閉省略示例?
- 17. AndEngine強制關閉加載示例
- 18. Android Renderscript示例強制關閉
- 19. MVVM關閉標籤示例的任何代碼示例?
- 20. 試圖理解一個關閉函數
- 21. JavaScript理解某些關閉行爲
- 22. 很難理解Lisp中
- 23. SQL很難理解查詢
- 24. 理解TensorFlow計算難度
- 25. 難以理解通配符
- 26. 難以理解Java 8 Lambda
- 27. Scala語法很難理解
- 28. 難以理解Java MouseEvent
- 29. 理解困難read.csv代碼
- 30. 難以理解這個宏
請看看這裏:http://stackoverflow.com/questions/111102/how-do-javascript-closures-work我也喜歡這個解釋https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Closures – ljnissen 2015-02-05 14:38:10
你能更具體地瞭解你不明白的東西嗎?你知道'closure1'和'closure2'包含'startAt'返回的函數嗎? (相關:[JavaScript關閉如何工作?](http:// stackoverflow。問題/ 111102/how-do-javascript-closures-work)) – apsillers 2015-02-05 14:39:14
apsillers,我打我的前額,但現在上面的例子使完成,因爲,謝謝。我仍在挖掘ljnissens鏈接,以便更好地理解如何輕鬆定義閉包。 – Tyrone 2015-02-05 21:44:42