1. 程式人生 > >JavaScript 使用閉包保護變數 防止汙染

JavaScript 使用閉包保護變數 防止汙染

使用JavaScript編寫外掛或團隊協作時,可使用閉包來解決此類以下兩個問題:

1、定義過多全域性變數,可能會造成全域性變數命名衝突;

2、在外掛內定義變數,需要保護該變數不被輕易修改;

 

優點:可以把區域性變數駐留在記憶體中,可以避免使用全域性變數;在呼叫過後不會被垃圾機制回收;

缺點:避免濫用閉包,佔用更多記憶體的缺點,用完要及時讓垃圾回收器回收 ( fn=null)應及時解除引用,否則會佔用更多存;

 

閉包簡單示例

最後一步return了一個函式,這個函式callName可將閉包內部變數值取出,也就避免了變數汙染;

var name = "外部name";
var init = (function(){ var name = "內部name"; function callName(){ console.log(name); //列印name } return function(){ callName(); //形成介面 } }()); init();

 

如果需要對重要引數防止被篡改,可使用閉包規定變數的getter和setter

例如

const CHANGE_FONT_SILE='CHANGE_FONT_SILE';
//設定一個閉包,把變數保護起來,通過返回值呼叫 function createStore() { let appState={ fontSize:'26px', title:{ text:'標題', color:'red' }, content:{ text:'類容', color:'green' } } //保護變數被修改,深克隆 let getter=()=>JSON.parse(JSON.stringify(appState)); //改變變數的方法,action代表一個命令物件,就是一個普通的js物件,起碼需要一個欄位控制命令型別type
let setter=(action)=>{ switch(action.type){ case CHANGE_FONT_SILE: appState.fontSize=action.fontSize; default: return; } } //返回出去的修改和取值的介面 return{ getter, setter } } let store=createStore(); //取值函式 store.getter().fontSize; //修改函式 store.setter({type:CHANGE_FONT_SILE,fontSize:'30px'});

 

 

參考連結   參考連結