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;
②其次由於閉包涉及跨域訪問,所以會導致性能損失,我們可以通過把跨作用域變量存儲在局部變量中,然后直接訪問局部變量,來減輕對執行速度的影響


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM