js闭包
Posted tags: 篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js闭包相关的知识,希望对你有一定的参考价值。 2017-03-23 文章来源:http://www.cnblogs.com/daysme 以上是关于js闭包的主要内容,如果未能解决你的问题,请参考以下文章变量分为全局变量和局部变量。
他们之前是用函数隔开的。
除了函数,其他都没有作用域之说。
全局变量:可重用。易被污染。
局部变量:不会被污染,不能重用。
闭包:既能重用变量,又能保护变量不被污染。
在函数内声明一个函数,并把这个函数返回出来。
闭包就是能读取其他函数内局部变量的函数。因为只有函数内部的子函数才能读取局部变量,
因为可以把闭包理解为定义在一个函数内部的函数。
闭包的作用:
一个是可以读取函数内部的局部变量。
一个是让这些变量始终保存在内存中。
全局变量
var n=1;
function fn(){
console.log(n);
}
fn();
局部变量
function fn(){
var n=1;
}
fn();
console.log(n); //获取不到变量,并报错
返回变量-最初的闭包思想
function fn(){
var n=1;
return 1;
}
var a=fn();
console.log(a);
闭包,其实就是一种函数。
function fn(){
var n=1;
return function(){
console.log(n)
};
}
var a=fn();
a();
例子:
function fn(){
var n=1;
add=function(){
n++;
}
function fn1(){
console.log(n); //获取变量
}
return fn1; //返回出来
}
var result=fn(); //保存到全局变量中
result();
add();
result();
此时 fn 中的局部就是一直保存在内存中,并没有在fn被调用后销毁。
为什么没有被销毁?因为 fn1() 被返回出来并且由全局变量接收保存了,
全局变量result是不会被销毁的,但result的值是fn1,fn1的值引用着 fn() 中的 n ,所以 fn 也不会被删除。
闭包三个步:
1.外层函数包裹着受保护的变量和操作变量的内层函数。
2.外层函数把内层函数返回到函数外。
3.使用者调用外层函数,获得内层函数。
此时被返回出来的函数就叫闭包。
闭包形成的原因:
外层函数的作为域对象无法释放。
例,没用到上层函数的任何东西。
var name=\'the window\';
var objcet={
name:\'my objcet\',
getname:function(){
return function(){
return this.name;
}
}
}
console.log(objcet.getname()());
例, 指向obj的this 已经保存在内存中。
var name=\'the window\';
var objcet={
name:\'my objcet\',
getname:function(){
var that=this;
return function(){
return that.name;
}
}
}
console.log(objcet.getname()());