被JavaScript中的闭包困惑

可能重复:
JavaScript关闭如何工作?
简单的英语JavaScript封闭和副作用? (分别)

我是JavaScript的新手,但我真的很关心闭包的工作方式。 有人可以用外行的话来解释他们是什么或为什么他们有用吗?


闭包在定义时就像一个函数的上下文。 每当一个函数被定义时,上下文就会被存储,并且即使函数的“正常”生命周期结束了,如果你保持对函数执行时定义的元素的引用,它仍然可以访问上下文的元素闭包),这实际上是你的函数在其定义中的范围。 对不起,我的英语不好,但可能这个例子会让你明白:

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获得

var num = 10; 

function addNum(myNum){ 
  return num + myNum; 
} 

assert( addNum(5) == 15, "Add two numbers together, one from a closure." );

发生的事情是变量num被捕获(封闭)在addNum函数中。

如果你有一些东西(预计这样不能正常运行),这是很方便的:

for(var t = 0; t < 5; t++) {
  var elem = document.getElementById('mydiv' + t);
  elem.onclick = function(e) {
     alert(t);
  };
};

这应该显示每个使用此事件处理程序设置的div的值5。

如果你将这个计数器的实例包含在你的事件处理程序中,那么它对于每一个都是不同的,这是预期的行为。

这是一个非常高级的话题。 一旦你对javascript更加熟悉,你可能希望看到关于这一点的学习。


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

链接地址: http://www.djcxy.com/p/83009.html

上一篇: Confused by closures in JavaScript

下一篇: What is wrong with my javascript scope?