闭包
闭包的概念
闭包就是能够读取其他函数内部变量的函数;
由于在JavaScript 语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单的理解成“定义在一个函数内部的函数”。在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。
当内部函数被保存到外部时,将会生成闭包。闭包会导致原有作用域链不能释放,造成内存泄漏。
闭包的作用
-
实现共有变量
eg:函数累加器
var add = (function (){ var count = 0; return function(){return count += 1;} })();
-
可以做缓存(存储结构)
eg:eater
function eater() { var food = ""; var obj = { eat : function (){ console.log("i am eating " + food); food = ""; }, push : function (myFood){ food = myFood; } } return obj; } var eaters = eater(); eaters.push('apple'); eaters.eat(); // i am eating apple
-
可以实现封装,属性私有化。
-
实现类和继承
function Person(){ var name = "default"; return { getName : function(){ return name; }, setName : function(newName){ name = newName; } } }; var p = new Person(); p.setName("Tom"); alert(p.getName()); var Jack = function(){}; //继承自Person Jack.prototype = new Person(); //添加私有方法 Jack.prototype.Say = function(){ alert("Hello,my name is Jack"); }; var j = new Jack(); j.setName("Jack"); j.Say(); alert(j.getName());
-
模块化开发,防止污染全局变量
闭包的用途
最大用处有两个:一个是前面提到的可以读取函数内部的变量;另一个就是让这些变量的值始终保持在内存中;
闭包注意点
- 由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题。
- 闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(Object)使用,把闭包当作它的公用方法(PublicMethod),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。
立即执行函数
定义:此类函数没有声明,在一次执行过后即释放。适合做初始化工作。
function traverse() {
var arr = [];
for(var i = 0; i < 10; i ++){
(function (j){
arr[j] = function () {
document.write(j + " ");
}
}(i));
}
return arr;
}
var myArr = traverse();
for(var j = 0; j < 10; j++){
myArr[j]();
}
// 0 1 2 3 4 5 6 7 8 9