普通函數
//a爲局部變量
function f1() {
var a = 1;
console.log("a: " + a);
}
//a爲全局變量
var a = 1;
function f2() {
console.log("a: " + a);
}
** 變量聲明時如果不使用 var 關鍵字,那麼它就是一個全局變量,即便它在函數內定義。**
//計數器
function count() {
var i = 0;
return ++i;
}
count(); //1
count(); //1
count(); //1
var i = 0;
function count() {
return ++i;
}
count(); //1
count(); //2
count(); //3
閉包 允許訪問局部作用域之外的數據
內嵌函數(閉包),使函數擁有私有變量 i,i的賦值只會執行一次
var count = (function() {
var i = 0; //賦值只進行一次
var add = function() {
i += 1;
return i;
};
return add;
})();
count(); //1
count(); //2
count(); //3
!!!閉包的性能問題:
通常來說,函數的活動對象會隨着執行環境一同銷燬,但引入閉包之後,由於引用仍存在於閉包中,所以此對象無法進行銷燬,這意味着腳本中的閉包與非閉包函數相比需要更多的內存開銷,在大型web應用中,是很大的性能問題,在IE中會導致內存泄漏。
優化方式:在退出函數之前,將不使用的局部變量全部刪除。