Confused by closures in JavaScript
本问题已经有最佳答案,请猛点这里访问。
Possible Duplicate:
How do JavaScript closures work?
Javascript closures and side effects in plain English? (separately)
我不熟悉JavaScript,但我对闭包是如何工作感到非常困惑。有人能用外行的术语解释他们是什么或者为什么他们有用吗?
闭包在定义时类似于函数的上下文。无论何时定义函数,都会存储上下文,即使函数的"正常"生命周期结束,如果在函数执行过程中保留对定义的元素的引用,它仍然可以访问上下文(闭包)的元素,而上下文(闭包)实际上是函数在其定义中的作用域。对不起,我的英语不好,但这个例子可能会让你明白:
1 2 3 4 5 6 7 8 9 10 | function test() { var a ="hello world"; var checkValue = function() { alert(a); }; checkValue(); a ="hi again"; return checkValue; } var pointerToCheckValue = test(); //it will print"hello world" and a closure will be created with the context where the checkValue function was defined. pointerToCheckValue(); //it will execute the function checkValue with the context (closure) used when it was defined, so it still has access to the"a" variable |
希望能有所帮助:—)
如果你从一个简单的使用开始,我从http://ejohn.org/apps/learn/49中得到
1 2 3 4 5 6 7 | var num = 10; function addNum(myNum){ return num + myNum; } assert( addNum(5) == 15,"Add two numbers together, one from a closure." ); |
发生的情况是变量
如果您有这样的东西(不希望它正常运行),这就变得方便了:
1 2 3 4 5 6 | for(var t = 0; t < 5; t++) { var elem = document.getElementById('mydiv' + t); elem.onclick = function(e) { alert(t); }; }; |
这应该显示用这个事件处理程序设置的每个DIV的值5。
如果您将计数器的实例包含在事件处理程序中,那么对于每个实例都可以是不同的,这是预期的行为。
这是一个相当高级的主题。一旦你对JavaScript更加熟悉了,你可能会想看看在这一点上如何学习它。
我强烈推荐以下文章。我发现它是理解闭包的一个很好的起点。