函數有不少種,咱們就選擇咱們不懂的函數開始學習!
在JavaScript中可使用匿名函數(在咱們學習Java的時候也有相似的概念,匿名實現類),在JavaScript中的函數也是一種對象,也是須要一塊內存對其進行保存。若是想調用該函數,咱們只是須要找到這塊內存便可,而後就能夠執行。關鍵步驟以下:javascript
一般咱們使用函數名來查找這塊地址,不過經過函數名只是找到這塊內存地址的一種工具而已。java
function test01(){ console.log("定義方式"); } //函數的調用 test01(); var test02 = function () { console.log("變量方式"); } //函數的調用 test02();
上述的示例,咱們就是經過函數名找到了這塊內存地址,在使用()進行函數的執行,也就是隻要咱們能找到這塊內存就能夠去執行!
匿名函數,顧名思義就是沒有名字的函數,其實在上面寫的test02函數表達式中,咱們就建立了匿名函數,並將該函數賦值給了變量test02
,用test02
來進行函數的調用,調用方式就是在變量test02
後面加入小括號,這是匿名函數的調用方式之一函數
還有一種匿名函數的調用規則以下:工具
第二步:使用小括號將內容括起來學習
關鍵步驟:這只是一種語法的要求,不然後面的執行語句沒法被引擎正確的識別,若是這樣將函數定義好,引擎就會爲其分配一塊內存保存
(function (x, y) { console.log(x+y); })(2, 3); //等價於代碼 var test03 = function(x,y){ console.log(x+y); }(2,3);
代碼分析spa
var log=(function(){ console.log("建立日誌函數"); return function(param){ console.log(param); }; })(); log("www.baidu.com");
這段代碼屬於一種比較經典的代碼,這裏建立了一個自動運行的匿名函數,不過其返回值仍然是一個匿名函數,也就是說函數自運行後返回的結果仍然是函數。把返回值的函數賦值給變量log,就可使用log變量來調用返回的函數了。日誌
請注意上述代碼中,咱們實際上是包含兩塊內存保存函數,自動運行的函數自己有一塊內存來保存,當碰到後面表示執行的小括號後會自動運行,另外還有一塊內存來保存所返回的函數,而返回的值實際上是這塊內存地址,這樣log變量就指向了這塊保存函數的內存,所以可使用log來完成對函數的執行。code
一些有趣的自運行函數的定義方式對象
// 下面2個括弧()都會當即執行 (function () { /* code */ } ()) // 推薦使用這個 (function () { /* code */ })() // 可是這個也是能夠用的 // 因爲括弧()和JS的&&,異或,逗號等操做符是在函數表達式和函數聲明上消除歧義的 // 因此一旦解析器知道其中一個已是表達式了,其它的也都默認爲表達式了 var i = function () { return 10; } (); true && function () { /* code */ } (); 0, function () { /* code */ } (); // 若是你不在乎返回值,或者不怕難以閱讀 // 你甚至能夠在function前面加一元操做符號 !function () { /* code */ } (); ~function () { /* code */ } (); -function () { /* code */ } (); +function () { /* code */ } (); // 還有一個狀況,使用new關鍵字,也能夠用,但我不肯定它的效率 // http://twitter.com/kuvos/status/18209252090847232 new function () { /* code */ } new function () { /* code */ } () // 若是須要傳遞參數,只須要加上括弧() void function(){ /* code */ }();