Closure in JavaScript

JavaScript中的函数:
      1.可以作为返回值, 参数或变量的值.
      2.可以嵌套定义.
      3.函数内部能引用外部变量(嵌套作用域).
这样就存在一个问题, 函数定义时(即实例化Function)的作用域链与函数执行时的作用域链可能不同. 闭包就是用来解决这个问题: 创建函数实际上是将引用环境和函数代码打包成一个可执行实体.
Code:
var test = function(i){
    
var funArray = new Array();
    
for (var j=0; j<i; j++)
    {
        funArray[j] 
= function(){
            alert(j);
        }
    }
    
return funArray;
}

var dummy = test(3);
dummy[
0](); // 输出3
dummy[1](); // 也是输出3
dummy[2](); // 也是输出3

虽然创建3个(互相独立的)闭包时 j 的值都不同, 但是打包的是同一个上下文, 因此输出是一样的.
Code:

function test(){
    
var i = 1;
    
var tmp1 = function(){
        alert(
++i);
    }
    
var tmp2 = function(){
        alert(
++i);
    }
    tmp1(); 
//2
    tmp2(); //3
    return [tmp1, tmp2];
}

var arr = test();
arr[
0](); //4
arr[1](); //5

闭包对外部变量的改变能反映到定义时的上下文, 并且能延长上下文中"正常"状况下会消失的作用域的生命期

posted @ 2009-09-17 22:29  FlyingCat  阅读(454)  评论(0编辑  收藏  举报