javascript闭包

今天在博客上看到大神所发的帖子,讲解的闭包特性,于是有了悟性,在此跟大家伙儿分享下闭包的神奇性与各种应用。

1:最简单的闭包

var a=10;

function change(){
   alert(a);//10
}

 是不是感到很简单,认为这只不过是定义了一个函数,输出了一个全局变量而已。其实这就是一个最直观的应用了闭包特性的小例子。再看看下面的例子:

var a=10;

function change(){
    var a=20;
   alert(a);//20
}
alert(a);//--10
change();--20
alert(a);--10

 三次输出的a的值是否跟想象中的不一样呢,为什么第三次a的值还是10;嘿嘿,这就是闭包的特性,函数内部的a与函数外部的a并不关联。

2:函数作用域

为什么要说函数作用域呢,这是因为闭包的机制其实就是建立在函数内外作用域的基础上产生的。

var n=999;
 f1(){
  alert(n);//999
}

f1();

 输出999;

f1(){
  var n=999;
}

alert(n);//b报错

 报错,这就是作用域的问题,函数内部的成员可以访问外部的变量,而外部的成员无法调用内部成员。

3:从外部读取局部变量

f1(){
var n=999;
  f2(){
    n++;
    alert(n);//1000
   }
  return f2;
} 
f1();//1000 

4:闭包的概念

各种专业文献上的“闭包”(closure)定义非常抽象,很难看懂。我的理解是,闭包就是能够读取其他函数内部变量的函数。  

所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。

 

5:闭包的一大特性,变量不会被垃圾机制回收,而是保存在内存中。

var a=0;
function(){
   a=10;//a的值已被改变
}
alert(a);//10

6:闭包例子

function f1(){
  a=10;
   function f2(){
    a++;
   alert(a);//11
  }
}
f2();//报错

 改成下面,就是闭包

 

function f1(){
  a=10;
   function f2(){
    a++;
   alert(a);
  }
  return f2;
}
f1();//报错

什么是闭包:

当内部函数 在定义它的作用域 的外部 被引用时,就创建了该内部函数的闭包 ,如果内部函数引用了位于外部函数的变量,当外部函数调用完毕后,这些变量在内存不会被 释放,因为闭包需要它们.

官方”的解释是:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。

相信很多人没办法直接读懂这句话。其实这句话通俗的来说就是:JavaScript中所有的function都是一个闭包。

 

function a() {  
    var i = 0; 
    function b()
    { alert(++i); }  
    return b;
   }
var c = a();
c();

 这段代码有以下几个特点:

1:函数b嵌套在函数a内部;

2:函数a返回函数b。

3:当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个闭包.

闭包的微观世界:

function f(x) {
   var g = function () {
        return x; 
     }
     return g;
  }
var h = f(1);
   alert(h());//undefined

  

  理解JavaScript的闭包是迈向高级JS程序员的必经之路,理解了其解释和运行机制才能写出更为安全和优雅的代码。

 

posted @ 2016-08-11 15:22  泪、殇  阅读(196)  评论(0编辑  收藏  举报