被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/1477.html