一.js闭包理解
闭包的三大特点为:
1、函数嵌套函数
2、内部函数可以访问外部函数的变量
3、参数和变量不会被回收。
好了闭包就学完了,就这么简单。
那么你一定很迷 接下来才是重点
常见的写法
1.
//第1种写法
function Circle(r) {
this.r = r;
}
Circle.PI = 3.14159;
Circle.prototype.area = function() {
return Circle.PI * this.r * this.r;
}
var c = new Circle(1.0);
alert(c.area());
2.
//第2种写法
var Circle = function() {
var obj = new Object();
obj.PI = 3.14159;
obj.area = function( r ) {
return this.PI * r * r;
}
return obj;
}
var c = new Circle();
alert( c.area( 1.0 ) );
3.
//第3种写法
var Circle = new Object();
Circle.PI = 3.14159;
Circle.Area = function( r ) {
return this.PI * r * r;
}
alert( Circle.Area( 1.0 ) );
4.
//第4种写法
var Circle={
"PI":3.14159,
"area":function(r){
return this.PI * r * r;
}
};
alert( Circle.area(1.0) );
二.闭包的作用
1、能够访问局部变量或者方法
var fn = function(){
var a = 10;
return function(){
a++;
console.log(a);
}
}
var b = fn();
setInterval(function(){
b();
b();
},30)
2、在for循环中可以保留i的值
(重要的面试题)!!!
var aLi = document.getElementById("list").getElementsByTagName("li");
for(var i=0;i<aLi.length;i++){
(function(a){
aLi[a].onclick = function(){
alert(a)
this.onclick = null;//只让它点击一次
}
})(i)
}
三.垃圾回收机制
原理理解:
当一个函数内部的一些方法或者属性没有在全局进行调用的时候,当前函数运行完毕以后就会被回收,下次在调用当前函数的时候函数内部的方法和属性都会被重置,如果一个函数的一些方法和属性在全局进行调用了,那么当前函数不会被销毁,下次在调用当前函数的时候里面的方法和属性不会进行重置。
简单的说就是不管你在外面哪个城市里面拼搏,只要一通你和你爸一通电话(函数运行),你爸永远都会在在家等你回去,哪怕你穷困潦倒,身无分文。
我想你一定理解了......
四.闭包的好处和坏处
好处
1.匿名自执行函数(比如UI的初始化,那么我们可以使用闭包)
var datamodel = {
table : [],
tree : {}
};
(function(dm){
for(var i = 0; i < dm.table.rows; i++){
var row = dm.table.rows[i];
for(var j = 0; j < row.cells; i++){
drawCell(i, j);
}
}
})(datamodel);
2.缓存
var CachedSearchBox = (function(){
var cache = {},
count = [];
return {
attachSearchBox : function(dsid){
if(dsid in cache){//如果结果在缓存中
return cache[dsid];//直接返回缓存中的对象
}
var fsb = new uikit.webctrl.SearchBox(dsid);//新建
cache[dsid] = fsb;//更新缓存
if(count.length > 100){//保正缓存的大小<=100
delete cache[count.shift()];
}
return fsb;
},
clearSearchBox : function(dsid){
if(dsid in cache){
cache[dsid].clearSelection();
}
}
};
})();
3 实现封装
var person = function(){
//变量作用域为函数内部,外部无法访问
var name = "default";
return {
getName : function(){
return name;
},
setName : function(newName){
name = newName;
}
}
}();
print(person.name);//直接访问,结果为undefined
print(person.getName());
person.setName("abruzzi");
print(person.getName());
得到结果如下:
undefined
default
abruzzi
4.面向对象
function Person(){
var name = "default";
return {
getName : function(){
return name;
},
setName : function(newName){
name = newName;
}
}
};
var john = Person();
print(john.getName());
john.setName("john");
print(john.getName());
var jack = Person();
print(jack.getName());
jack.setName("jack");
print(jack.getName());
运行结果如下:
default
john
default
jack
参考:https://blog.csdn.net/sunlylorn/article/details/6534610
坏处
1.内存消耗
于闭包引用另外一个函数的活动对象,因此这个活动对象无法被销毁,这意味着,闭包比一般的函数需要更多的内存消耗
2.性能问题
使用闭包时,会涉及到跨作用域访问,每次访问都会导致性能损失。
四.单例模式
未完待续。。。