js闭包
闭包意味着内层的函数可以引用存在于包绕它的函数的变量,即使外层的函数的执行已经终止。这一特殊的论题可能是非常强大又非常复杂的。
闭包还能解决另一个常见的JavaScript编码方面的问题。JavaScript新手趋向于在全局作用域里放置许多变量。这一般被认为是不好的习惯,因为那些变量可能悄悄地影响其它的库,导致令人迷惑的问题的产生。使用一个自执行的、匿名的函数,你可以从根本上隐藏所有的通常的全局变量,使它们对其它代码不可见。
1 //创建一个用作包装的匿名函数
2 (function(){
3 //这个变量通常情况下应该是全局的
4 var msg = "Thanks for visiting!";
5 //为全局对象绑定新的函数
6 window.onunload = function(){
7 //使用了“隐藏”的变量
8 alert( msg );
9 };
10 //关闭匿名函数并执行之
11 })();
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 最后的值(比如,一个数组的最后位置),而不是你所期望的那个。