閉包是指有權訪問另外一個函數做用域中的變量的函數。緩存
function createFunc() { var name = "wheeler"; return function () { return name; } } var nameFunc = createFunc(); // nameFunc是一個閉包 var name = nameFunc(); console.log(name); // 解除對匿名函數的應用(以便釋放內存) nameFunc=null;
內部函數能夠訪問外部函數的變量name,內部函數的做用域包含了外部函數的做用域
(因爲閉包會攜帶包含它的函數的做用域,可能致使內存佔用過多,所以謹慎使用閉包)安全
// 塊級做用域(一般稱爲私有做用域)的匿名函數的語法 (function(){ // 塊級做用域 })();
將閉包定義在塊級做用域裏面閉包
// 能夠減小閉包占用的內存問題,由於沒有指向匿名函數的引用。只要函數執行畢,就能夠當即銷燬其做用域鏈了 (function(){ function createFunc() { var name = "wheeler"; return function () { return name; } } var nameFunc = createFunc(); var name = nameFunc(); console.log(name); })();
var returnNum = (function () { var num = 0; function changeNum(value) { num = value; } return { add: function () { changeNum(10); }, delete: function () { changeNum(-10); }, getNum: function () { return num; } } })(); // 閉包 console.log(returnNum.getNum()); returnNum.add(); console.log(returnNum.getNum()); returnNum.delete(); console.log(returnNum.getNum());
var CacheCount = (function () { var cache = {}; return { getCache: function (key) { if (key in cache) {// 若是結果在緩存中 return cache[key];// 直接返回緩存中的對象 } var newValue = getNewValue(key); // 外部方法,獲取緩存 cache[key] = newValue;// 更新緩存 return newValue; } }; })(); console.log(CacheCount.getCache("key1"));
var person = function(){ var name = "default";//變量做用域爲函數內部,外部沒法訪問 return { getName : function(){ return name; }, setName : function(newName){ name = newName; } } }(); console.log(person.name);// undefined console.log(person.getName()); person.setName("wheeler"); console.log(person.getName());
function func(param) { return function() { console.log(param); } } var myFunc = func('wheeler'); setTimeout(myFunc, 1000);