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