正确理解javascript闭包

     
      关于javascript闭包,网络上很容易检索到的几篇文章,理解有误,他们把闭包的用途,闭包的性质误当成了闭包的含义。今天在博客园偶尔看见有人再谈闭包这个问题。所以引用下来,以正"闭包"。

  闭包意味着内层的函数可以引用存在于包绕它的函数的变量,即使外层的函数的执行已经终止。这一特殊的论题可能是非常强大又非常复杂的。

  闭包还能解决另一个常见的JavaScript编码方面的问题。JavaScript新手趋向于在全局作用域里放置许多变量。这一般被认为是不好的习惯,因为那些变量可能悄悄地影响其它的库,导致令人迷惑的问题的产生。使用一个自执行的、匿名的函数,你可以从根本上隐藏所有的通常的全局变量,使它们对其它代码不可见。

1 //创建一个用作包装的匿名函数
2 (function(){
3 //这个变量通常情况下应该是全局的
4 var msg = "Thanks for visiting!";
5 //为全局对象绑定新的函数
6 window.onunload = function(){
7 //使用了“隐藏”的变量
8 alert( msg );
9 };
10 //关闭匿名函数并执行之
11 })();

最后,要注意的一点是:

闭包允许你引用存在于父级函数中的变量。然而,它并不是提供该变量创建时的值;它提供的是父级函数中该变量最后的值。你会看到这个问题最通常是在一个for 循环中。有一个变量被用作迭代器(比如i),在for内部新的函数被创建,并使用了闭包来引用该迭代器。问题是,当新的闭包函数被调用时,它们将会引用该iterator 最后的值(比如,一个数组的最后位置),而不是你所期望的那个。

posted @ 2011-08-25 10:55  章鱼欧  阅读(368)  评论(0编辑  收藏  举报