匿名函數和閉包

以下全是個人理解以及網上查找而來,如有不對請指正...

匿名函數

幾 種匿名的寫法

(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表達式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章