在JavaScript中被闭包困惑

时间:2011-11-17 17:56:20

标签: javascript closures

  

可能重复:
  How do JavaScript closures work?
  Javascript closures and side effects in plain English? (separately)

我是JavaScript的新手,但我对闭包的工作原理感到困惑。有人可以用非专业人的术语解释它们是什么或它们有用的原因吗?

3 个答案:

答案 0 :(得分:13)

闭包类似于定义函数的上下文。无论何时定义函数,都会存储上下文,即使正常情况下也是如此。函数的生命周期结束了,如果你保持对函数执行中定义的元素的引用,它仍然可以访问上下文元素(闭包),这实际上是函数在其定义中的作用域。抱歉我的英文不好,但可能这个例子会让你理解:

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

希望它有所帮助: - )

答案 1 :(得分:3)

如果您从简单使用开始,我从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." );

正在发生的是变量numaddNum函数中的陷阱(封闭)。

如果你有一些东西(预计不会正常运行),这就变得很方便了:

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

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

如果在计算器事件处理程序中包含该计数器的实例,则每个计数器的实例可能不同,这是预期的行为。

这是一个非常高级的主题。一旦你对javascript更加熟悉,你可能希望在那时学习它。

答案 2 :(得分:0)

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