1. 程式人生 > 實用技巧 >JS回撥函式&&閉包

JS回撥函式&&閉包

一、JS 回撥函式

函式實際上是物件:它們能被“儲存”在變數中,能作為函式引數被傳遞,能在函式中被建立,能從函式中返回;
示例:

//第一種方法:匿名函式作為回撥函式
var generalLastName = "Cliton";
function getInput(options, callback){
    var arr = [];
    arr.push(options);
    //將全域性變數generalLastName傳遞給回撥函式
    callback(generalLastName,arr);
}
getInput({name:"Rich",speciality:"Javascript"}, function
(generalLastName,arr){ console.log(generalLastName + ":" + arr[0].speciality) // Cliton:Javascript }); //第二種方法:命名函式作為回撥函式 var generalLastName = "Cliton"; function getInput(options, callback){ var arr = []; arr.push(options); //將全域性變數generalLastName傳遞給回撥函式 callback(generalLastName,arr); }
function call(generalLastName,arr){ console.log(generalLastName + ":" + arr[0].speciality) // Cliton:Javascript } getInput({name:"Rich",speciality:"Javascript"}, call); //補充驗證 function getInput(options, callback){ //確保callback是一個函式 if(typeof callback === "function"){ //呼叫它,既然我們已經確定了它是可呼叫的
callback(options); } }

二、閉包

閉包是指有權訪問另一個函式作用域中的變數的函式
閉包3個特性:
①函式巢狀函式
②函式內部可以引用函式外部的引數和變數
③引數和變數不會被垃圾回收機制回收

function f1(){
        var n = 123;
        function f2(){    //f2是一個閉包
            return n;
        }    
        return f2;
    }
//呼叫:
var test = f2(); var v = test() //v=123

閉包優點:
①保護函式內的變數安全 ,實現封裝,防止變數流入其他環境發生命名衝突
②在記憶體中維持一個變數,可以做快取(但使用多了同時也是一項缺點,消耗記憶體)
③匿名自執行函式可以減少記憶體消耗
缺點
①被引用的私有變數不能被銷燬,增大了記憶體消耗,造成記憶體洩漏,解決方法是可以在使用完變數後手動為它賦值為null;
②其次由於閉包涉及跨域訪問,所以會導致效能損失,我們可以通過把跨作用域變數儲存在區域性變數中,然後直接訪問區域性變數,來減輕對執行速度的影響