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. 困难时间理解javascript示例
- 4. 理解多态性难点
- 5. 难点理解逻辑
- 6. 关闭在JavaScript了解示例
- 7. 理解道场封闭示例
- 8. 关闭MediaPlayer中的示例
- 9. C++ 0x关闭/ lambdas示例
- 10. 关闭定义和示例
- 11. 使用VB.NET理解JavaScript API示例时遇到困难
- 12. 关闭在JavaScript理解
- 13. Swift:理解迅速关闭
- 14. 需要更多关于w3schools的解释javascript关闭示例
- 15. 理解此递归的难点
- 16. 理解简单Android ListView的难点
- 17. 快速理解UINavigationController&navigationController难点:presentsViewController
- 18. 难点理解MapKit坐标系统
- 19. Clojure理解示例
- 20. 理解构成Monads的理解示例
- 21. 机器如何理解1表示开启,0表示关闭?
- 22. 解决例外文件关闭的StreamWriter
- 23. 解决数独难题的难点
- 24. 处理灾难性例外
- 25. Javascript关闭:MDN中的实际关闭示例
- 26. Writer Monad的理解示例
- 27. 在关闭EC2实例之前提示
- 28. “Javascript:The good parts”中关闭的示例
- 29. 快速关闭省略示例?
- 30. Javascript关闭的实际用法/示例
请看看这里: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