JavaScript闭包(closure)

闭包(closure)的概念

    A closure is a persistent scope which holds on to local variables even after the code execution has moved out of that block. Languages which support closure (such as JavaScript, Swift and Ruby) will allow you to keep a reference to a scope (including its parent scopes), even after the block in which those variables were declared has finished executing, provided you keep a reference to that block or function somewhere.

     一个闭包是一个持续存在的作用域,它保存好了局部变量,即使程序已经不在那个代码块运行。一些编程语言他们支持闭包(例如JavaScript, Swift 以及 Ruby)允许你保存一个闭包的引用(包括这个闭包的上一级、上N级作用域),即便是那个代码块声明的局部变量已经结束了运行。这些编程语言提供了保存这个引用的方法,在某个位置保存着该代码块或者函数。

    由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成“定义在一个函数内部的函数”。


下面是一段没有使用闭包的代码:

function fn(){ 
        var myvar = 'Internal Variable'; 
    };
console.log(myvar);   //myvar is not defined

    执行的时候报错,说明函数外部无法直接访问函数内部的变量myvar

    那么,如何在函数外部访问函数内部的变量呢?方法如下:

方法一:利用函数的返回值访问函数内部的变量

 function fn() {

        var myvar = 'Internal Variable';  //Defined a local variable 

        return myvar;  //Return the variable

      }

      var myvar = fn();  //Receive the return value

      alert(myvar);   //Internal Variable

方法二:在函数内部定义全局变量(Global variable)

function fn() {

    var myvar = 'Internal Variable';  //Defined a Local variable 

    myvar_G = myvar;  //Defined a Global variable

}

     fn();

     alert(myvar_G);   //Internal Variable

方法三:【闭包】使用函数内部的子函数读取局部变量(Local variable)

var f1 = null;
function fn(){
    var a = 0;
    f1 = function(){
     a++;
     f1.a = a;
 };
}
fn(); 
f1();
alert(f1.a);  //1
f1();
alert(f1.a);  //2

或者 

function fn(){
    var num = 0;
    return function(){
     num += 1;
        alert(num);   
    };  
 }
 var f = fn();
 f();   //1
 f();   //2

    要注意的是,使用前一种方法时只能使用函数表达式(Function expression)的方法创建子函数,而不能使用函数声明(Function Declaration)的方法创建子函数,因为使用函数声明的方法创建的子函数在主函数外部无法调用。

   补充一下两种函数定义方法的差别:

    用函数声明创建的函数:function fn() {//code}可以在fn()定义之前就进行调用;而用函数表达式创建的函数fun1 = function() {//code}不能在fun1被赋值之前进行调用。

    在JS解析时JS编译器将函数fn()定义进行了函数提升。因此,用函数声明创建的函数可以在函数解析后调用,而用函数表达式创建的函数是在运行时进行赋值,且要等到表达式赋值完成后才能调用。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值