javascript--當即執行函數

  當函數被包含在一堆括號()內部就稱爲了一個表達式,經過在末尾上加上另外一個()能夠當即執行這個函數,這樣的表達式就叫作當即執行函數表達式(Immediately Invoked Function Expression,簡稱IIFE),如:(function(){...})()或者(function(){...}())javascript

 

  IIFE的另外一個很是廣泛用法就是在外層括號傳入參數進去,給內部的匿名韓式調用,來看下代碼吧:java

var a = 2;
    (function(global){
        var a = 3;
        console.log(a);             //3
        console.log(global.a);      //2
    })(window)

  能夠看到將window做爲參數傳入內部函數中,內部函數經過global.a訪問到全局變量a編程

  

  javascript支持函數式編程的,函數也能夠做爲對象傳來傳去,來看一段代碼:閉包

(function IIFE(def){
        def(window);
    })(function def(global){
        var a = 3;
        console.log(a);             //3
        console.log(global.a);      //2
    });

  

  再來看看當即執行函數和閉包應用的一個經典例子:異步

for(var i=0;i<5;i++){
        setTimeout(function(){
            console.log(i);
        },100)
    }

  這段代碼看起來是循環5次,間隔100ms打印出0,1,2,3,4,但實際上只會輸出五次5,由於定時器是異步事件,異步事件只能在同步事件執行完後才能執行,也就是說定時器的回調在for循環完才執行,這裏須要使用IIFE聲明並當即執行函數來建立做用域,修改一下代碼:函數式編程

for(var i=0;i<5;i++){
        (function(i){
            setTimeout(function(){
                console.log(i);
            },100)
        })(i);
    }

  在迭代裏面使用IIFE會爲每一個迭代都生成一個新的做用域,使得延遲函數的回調能夠將新的做用域封閉在每一個迭代裏,每一個迭代都會含有依着正確的值給咱們訪問,記得實習第一天,老大給我出了個題,用原生js給5個li綁定點擊事件,點擊li彈出當前li的index,也是用這樣的方法解決的。函數

相關文章
相關標籤/搜索