以下全是個人理解以及網上查找而來,如有不對請指正...
匿名函數
幾 種匿名的寫法
(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代碼
- function add(a) {
- return function (b) {
- return a + b;
- };
- }
- var func = add(10);
- alert(func(20));
我想經過了前面有關函數的描述,這個例子應該很清楚的理解。 JavaScript裏面的函數就是對象,他可以做對象能做的一切事情——我們首先定義了一個函數add,它接受一個參數,這個函數返回一個匿名函數,這 個匿名函數也接受一個參數,並且會返回這個參數同外部函數的那個參數的和。因此在我們使用的時候,我們將add返回的匿名函數賦值給func,然後調用 func,就返回了這兩個數的和。
當我們創建一個這樣的函數,這個函數內部的一個變量能夠在函數外面被引用時, 我們就稱創建了一個閉包。仔細的品味一下:這就是那個閉包的定義。
看看我們的代碼:首先,它有一個內部變量,就是那個匿名函數;其次,這個函數 將匿名函數返回了出去,以便外面的變量可以引用到內部定義的變量。
2. 閉包的作用
閉包有什麼用呢?或許現在還看不出來,那麼看看這段代碼:
Js代碼
- function inc(a) {
- var i = 0;
- return function () {
- return i;
- };
- }
- var num = inc();
- alert(num());
本來,這個變量 i 在函數外面是訪問不到的,因爲它是 var 定義的,一旦跳出作用域,這個變量就被垃圾回收了,但是,由於我們使用了閉包,在外面是能夠訪問到這個變量的,因此它並不被垃圾回收!
如果還是不明白閉包的作用,那麼看一段應該很熟悉的代碼:
Js代碼
- function Person() {
- var id;
- this .getId = function () {
- return id;
- }
- this .setId = function (newId) {
- id = newId;
- }
- }
- var p = new Person();
- p.setId(1000);
- alert(p.getId()); // 1000
- alert(p.id); // undefined
我們定義一個類Person,它有一個id屬性。現在這個屬性的行爲很像是私 有變量——只能通過 setter 和 getter 函數訪問到。沒錯,這就是閉包的一個用途:製造類的私有變量!
閉包還有一個作用:在內存中維護一個變量,不讓垃圾回收器回收這個變量。這裏 的例子就不再舉出了。
這裏我們只是簡單的說了JavaScript的閉包的概念,並沒有涉及閉包的 內存模型等等之類。這是一個相當重要的概念,Java社區中的部分成員一直對閉包夢寐以求,C#也已經在最新版本中添加了閉包的概念,只不過在那裏稱爲 lambda表達式。