JS——函數小結(2),js函數小結
匿名函數和閉包
到目前為止我們學過的函數都有一個函數名通過函數名傳遞相應的參數調用該函數,但是這次在JS中的接觸到函數可以沒有名字名字就是匿名函數。那麼我們一般是如何調用匿名函數的呢
方法一:這也是函數的一種聲明方式var sum=function(x,y) { return x+y; } alert(sum (2,3)); // "5" 方法二:匿名函數還能夠進行自我執行Alert((function(x,y) { return x+y;})(2,3));
匿名函數的自我執行可以解決匿名函數的一些問題,例如在迴圈中的匿名函數是有一定的問題的
function box(){ var arr=[]; //在迴圈中使用匿名函數 for(var i=0;i<5;i++){ arr[i]=function(){ return i; }; } return arr;} var b=box();//在這裡調用box()的時候,裡面的迴圈已經執行完畢了,執行到return了,所以最後return的arr的最終結果為51、調用內部的匿名函數輸出結果for(var i=0;i<5;i++){ alert(b[i]()); //結果都為5個5。這裡調用執行匿名函數時i已經為5,所以不會再做++了,所以結果都為5}
這樣的問題就可以通過匿名函數的自我執行解決
//通過匿名函數的自我執行function box(){ var arr=[]; for(var i=0;i<5;i++){ arr[i]=(function(num){ //通過自我及時執行匿名函數,將每個值都儲存到arr中 return num; })(i); } return arr;}var b=box(); for(var i=0;i<5;i++){ alert(b[i]); //依次返回 1 2 3 4 5}
在JS的函數中還學習了閉包,自己理解的就是函數中再放入一個函數就構成閉包。給出的官方的定義是:某種程式語言中的代碼塊允許一級函數存在並且在一級函數中所定義的自由變數能不被釋放,直到一級函數被釋放前,一級函數外也能應用這些未釋放的自由變數。這段話結合JS視頻中給出的例子
function box(){//聲明box函數 var age=100; //age是在box內的局部變數 returnfunction(){ //一個匿名函數,這樣就構成了閉包 age++; //對局部變數進行自加 return age;//返回結果 };}var b=box();//這裡對age進行了初始化值為100alert(b());//101alert(b());//102alert(b());//103//實現對age累加。如果不使用閉包,每次回調用box這樣每次都會初始化age,無法實現累加
box()就是一級函數其中的age是自由變數初始值為100,每次進行b()的時候是對其中匿名函數的自我執行,因為構成了閉包,所以在調用函數自我執行時其中的age是不會被釋放的,從而實現累加。
小結
匿名函數和閉包在實際的應用中經常是結合到一起的,例如在迴圈中的匿名函數取值是存在問題的還可以使用閉包來解決JS中的很多知識都是第一次的接觸到,結合視頻中講的執行個體和在後期部落格執行個體的應用中自己進行的初步簡單的理解,知識能夠把視頻中的知識點理解通,還有待深一步的理解。