JS回撥函式&&閉包
阿新 • • 發佈:2020-09-17
一、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;
②其次由於閉包涉及跨域訪問,所以會導致效能損失,我們可以通過把跨作用域變數儲存在區域性變數中,然後直接訪問區域性變數,來減輕對執行速度的影響