天天看點

淺談匿名函數和閉包

什麼是匿名函數和閉包 ? 函數我們最常見的是 function fn(){},這樣的 申明 然後fn()調用這個函數 但是我們還有一種是表達式函數 var ss = function(){}這樣的 也可以叫匿名函數 然後指派給ss 其實這兩種函數最主要的差別是 第一種是fn()在任何位置都可以調用函數 但是第二種在申明var ss =function(){}前調用這個函數 就會報錯 因為找不到這個函數 其實第二種函數 很像我們申明一個變量一樣 var s = 100; 在此申明s之前 用alt(s);也是肯定會報錯 一樣的道理!這是表達式函數 但是我們最常見的匿名函數是這樣的格式:(function(){})(); 最後一個括号是指立即觸發這個函數 !當然在最後括号裡面可以傳參,那麼什麼是閉包 閉包個人了解 可以分為一個簡單的了解和複雜的函數了解!下面寫個函數如下:

var s = "部落客";

function a(){

var m = 44;

   alert(s); //當然會彈出“部落客”;因為它是全局函數 在任何函數任何地方都可以通路,那麼我在a函數内在寫個函數

alert(k); //不能通路 因為k是b函數内的局部變量 那麼外部函數是不能通路其他函數内的局部變量的

  function b(){

   var k=123; 

    alert(s);//也可以通路 

    alert(m);//可以正常通路 因為b函數在a函數内 那麼相對于a函數來說 那麼m是b函數的全局變量;

}

b();

a();//在最外面調用這個函數  

這上面是簡單的閉包;那麼是下面的複雜的了解javascript的閉包

<script> 

//在ECMAScript中,在函數聲明處向函數外部看到的聲明的所有變量,在函數内部都能通路到它們的最終值! 

  function fnTest(arr) { 

        for (var i=0;i < arr.length;i++) { 

            arr[i]=function () { 

                alert(i+" | "+arr[i]); 

            }; 

        } 

    } 

    var arr = [0,1,2,3,4,5]; 

    fnTest(arr); 

    for (var i=0;i < arr.length;i++) { 

        arr[i]();//始終輸出6還有一個undefined 

        //因為函數退出後,i值為6,是以通路到的值隻有6 

</script> 

總之 閉包函數

閉包函數隻能通路變量的最終值!!!

本文轉自 塗根華 51CTO部落格,原文連結:http://blog.51cto.com/tugenhua/735856,如需轉載請自行聯系原作者

繼續閱讀