可能重复:
How do JavaScript closures work?
Javascript closures and side effects in plain English? (separately)
我是JavaScript的新手,但我对闭包的工作原理感到困惑。有人可以用非专业人的术语解释它们是什么或它们有用的原因吗?
答案 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." );
正在发生的是变量num
被addNum
函数中的陷阱(封闭)。
如果你有一些东西(预计不会正常运行),这就变得很方便了:
for(var t = 0; t < 5; t++) {
var elem = document.getElementById('mydiv' + t);
elem.onclick = function(e) {
alert(t);
};
};
这应该显示使用此事件处理程序设置的每个div的值。
如果在计算器事件处理程序中包含该计数器的实例,则每个计数器的实例可能不同,这是预期的行为。
这是一个非常高级的主题。一旦你对javascript更加熟悉,你可能希望在那时学习它。
答案 2 :(得分:0)
我强烈推荐以下article。我发现它是理解闭包的一个很好的起点。