闭包,this指向,内存泄漏
Posted 耿鑫
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了闭包,this指向,内存泄漏相关的知识,希望对你有一定的参考价值。
通过自我执行来执行匿名函数
(function(){ //(匿名函数)(); 第一圆括号放匿名函数,是一个表达式,第二圆括号执行
return ‘Lee‘;
})();
//把匿名函数自我执行的返回值赋值给变量
var box=(function(){
return ‘Lee‘;
})();
alert(box);
//自我执行匿名函数的传参
(function(age){
alert(age);
})();
//闭包,函数里面放一个匿名函数
function box(){
return function(){ //闭包
return ‘Lee‘;
}
}
alert(box()());
//通过闭包返回局部变量
function box(){
var user=‘Lee‘;
return function(){ //通过匿名函数返回box()局部变量
return user;
};
}
alert(box()());
//使用匿名函数实现局部变量驻留内存中从而累加
function box(){
var age=100;
return function(){
age++;
return age;
}
}
var b=box();
alert(b());
alert(b());
alert(b());
alert(b());
b=null; //解除引用,等待垃圾回收
//循环里匿名函数取值问题
function box(){
var arr=[];
for(var i=0;i<5;i++){
arr[i]=function(){
return i;
}
}
return arr;
}
var b=box();
for(var i=0;i<b.length;i++){
alert(b[i]()); //[5,5,5,5,5]
}
//改1
function box(){
var arr=[];
for(var i=0;i<5;i++){
arr[i]=(function(num){ //通过自我及时执行匿名函数
return num;
})(i);
}
return arr;
}
var b=box();
for(var i=0;i<b.length;i++){
alert(b[i]()); //[0,1,2,3,4]
}
//改2 这种方法用的更多
function box(){
var arr=[];
for(var i=0;i<5;i++){
arr[i]=(function(num){
return function(){ //因为闭包可以将变量驻留在内存中
return num;
}
})(i);
}
return arr;
}
var b=box();
for(var i=0;i<b.length;i++){
alert(b[i]());
}
//关于this对象
var box={
getThis:function(){
return this;
}
}
alert(box.getThis()); //[object Object]
var box={
getThis:function(){
return function(){ //闭包在运行时指向window,因为闭包并不属于这个对象的属性或方法。
return this;
}
}
}
alert(box.getThis()()); //[object Window]
var box={
user:‘The Box‘,
getUser:function(){
return function(){
return this.user;
}
}
}
alert(box.getUser().call(box)); //对象冒充,就可以指向box,打印出The Box
下面是重点:
var box=‘The Window‘;
var box={
user:‘The Box‘,
getUser:function(){
//这里作用域的this是Box
var that=this;
return function(){
//这里作用域的this是window
return that.user;
}
}
};
alert(box.getUser()()); //打印出The Box
以上是关于闭包,this指向,内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章