匿名函数和闭包

以下全是个人理解以及网上查找而来,如有不对请指正...

匿名函数

几 种匿名的写法

(function() {})();最常见到的;

(function(){}());

void function(){};

错 误的写法

function(){}(); 

为什么会这样了,  看看函数声明的语法和函数表达式的语法说明

 一.函数声明

function name([param[, param[, ... param]]]) {
   statements
}

这里的函数名称name是不可以省略的,省略了函数名就会报错

function (){alert('eee')}

因为编译器当他是函数声明而代码中没有函数名,所以就报错了.

二.函数表达式

function [name]([param] [, param] [..., param]) {
   statements
}

函数名称name可以被省略,省略name就是所谓的匿名函数.

说明一点:如果需要创建匿名函数,则必须给出一个函数表达式而非函数的显式声明

1/2/3匿名函数代码模式只不过是通过括号或者void告诉编译器,把function(){}当作函数表达式来解释罢了。这其中并没有那么复杂 的优先级和void操作符原理。这只不过是一个简单的语法转换。

可以想象,只要符合函数表达式的语法,我们就可以创建出N种匿名函数代码模式,比如

!!function(){
   alert('yo');
}()
+function(){
   alert('yo');
}()

完了  唉 好象上面都是转载的别人的 嘿嘿

顺便写写匿名函数的好处

能够不使用全局变量,防止变量冲突,不知道还有没有??????

还有就是 有些人看到(function(){})();
就说什么闭包 闭包 

这可是错误的 要function中的 匿名函数 引用外部的变量 才能算是闭包.........

 

 

本博客转载于:http://devbean.javaeye.com/blog/409566

闭包这个概念看上去很深奥,这个词在离散数学里面的意思确实比较难于理解。在 这里,我们先可以把闭包理解成是一种匿名函数或者匿名类。

1. 什么是闭包?

什么是闭包?一种正式的解释是:所谓闭包,指的是一种拥有很多变量并且绑定了 这些变量的环境的表达式(通常是一个函数),因而这些变量也是这个表达式的一部分。

相信很多人都不会理解这个定义,因为他的学术味道太浓了——或许你喜欢从字面 的语法上进行分析:首先,它是一个表达式,这个表达式绑定了很多变量以及这些变量的环境。不过这并没有什么意义,这依然不会告诉我们什么是闭包。

那么,来看一个例子:

Js代码

  1. function  add(a) {  
  2.     return   function (b) {  
  3.         return  a + b;  
  4.     };  
  5. }  
  6. var  func = add(10);  
  7. alert(func(20));  

我想经过了前面有关函数的描述,这个例子应该很清楚的理解。 JavaScript里面的函数就是对象,他可以做对象能做的一切事情——我们首先定义了一个函数add,它接受一个参数,这个函数返回一个匿名函数,这 个匿名函数也接受一个参数,并且会返回这个参数同外部函数的那个参数的和。因此在我们使用的时候,我们将add返回的匿名函数赋值给func,然后调用 func,就返回了这两个数的和。

当我们创建一个这样的函数,这个函数内部的一个变量能够在函数外面被引用时, 我们就称创建了一个闭包。仔细的品味一下:这就是那个闭包的定义。

看看我们的代码:首先,它有一个内部变量,就是那个匿名函数;其次,这个函数 将匿名函数返回了出去,以便外面的变量可以引用到内部定义的变量。

2. 闭包的作用

闭包有什么用呢?或许现在还看不出来,那么看看这段代码:

Js代码

  1. function  inc(a) {  
  2.     var  i = 0;  
  3.     return   function () {  
  4.         return  i;  
  5.     };  
  6. }  
  7. var  num = inc();  
  8. alert(num());  

本来,这个变量 i 在函数外面是访问不到的,因为它是 var 定义的,一旦跳出作用域,这个变量就被垃圾回收了,但是,由于我们使用了闭包,在外面是能够访问到这个变量的,因此它并不被垃圾回收!

如果还是不明白闭包的作用,那么看一段应该很熟悉的代码:

Js代码

  1. function  Person() {  
  2.     var  id;  
  3.     this .getId =  function () {  
  4.         return  id;  
  5.     }  
  6.     this .setId =  function (newId) {  
  7.         id = newId;  
  8.     }  
  9. }  
  10. var  p =  new  Person();  
  11. p.setId(1000);  
  12. alert(p.getId()); // 1000   
  13. alert(p.id); // undefined   

我们定义一个类Person,它有一个id属性。现在这个属性的行为很像是私 有变量——只能通过 setter 和 getter 函数访问到。没错,这就是闭包的一个用途:制造类的私有变量!

闭包还有一个作用:在内存中维护一个变量,不让垃圾回收器回收这个变量。这里 的例子就不再举出了。

这里我们只是简单的说了JavaScript的闭包的概念,并没有涉及闭包的 内存模型等等之类。这是一个相当重要的概念,Java社区中的部分成员一直对闭包梦寐以求,C#也已经在最新版本中添加了闭包的概念,只不过在那里称为 lambda表达式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值