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

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

转载于:https://www.cnblogs.com/FlyingCat/archive/2009/09/17/closure_in_javascript.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值