被javascript中的闭包搞糊涂了

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." );

发生的情况是变量num被困(封闭)在addNum函数中。

如果您有这样的东西(不希望它正常运行),这就变得方便了:

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更加熟悉了,你可能会想看看在这一点上如何学习它。


我强烈推荐以下文章。我发现它是理解闭包的一个很好的起点。