Javascript匿名函数和闭包

//普通函数
function box(){
	return 'Lee';
}
alert(box());

//匿名函数
function (){         //单独的匿名函数,是无法运行的
	return 'Lee';    //就算能运行,也无法调用,因为没有名称
}


//把匿名函数赋值给变量

var box = function(){
	return 'Lee';
};
alert(box());


//通过自我执行来执行匿名函数
(function(){
	alert('Lee');
})();

//把匿名函数自我执行的返回值赋值给变量
var box = (function(){return 'Lee';})();
alert(box);

//自我执行匿名函数的传参
(function (age){ alert(age);})(100);


//函数里放一个匿名函数
function box(){
	return function(){   // 闭包
		return 'Lee';
	}
}
alert(box()());

//通过闭包返回局部变量
function box(){
	var age = 100;
	return function(){
		return age;
	}
}
alert(box()());

//使用全局变量进行累加
var age = 100;
function box(){
	age++;
}
alert(age);
box();
alert(age);
box();
alert(age);

//使用匿名函数实现局部变量驻留内存中进行累加
function box(){
	var age = 100;
	return function(){
		age++;
		return age;
	}
}
alert(box()());//101
var b = box();
alert(b()); //101
alert(b()); //102
alert(b()); //103
b= null; //解除引用,等待垃圾回收


//循环里面的匿名函数的取值问题
function box(){
	var arr=[];
	for(var i=0; i<5; i++){
		arr[i]=function(){
			return i;
		};
	}
	return arr;
}
//alert(box()[0]);
var b = box();
for(var i=0; i<5; i++){
	alert(b[i]());  //循环已经执行完毕了,i最终是4++=5,那么最终就是5
}

//改0
function box(){
	var arr=[];
	for(var i=0; i<5; i++){
		arr[i] = i;
	}
	return arr;
}
var b = box();
for(var i=0; i<5; i++){
	alert(b[i]);
}

//改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<5; i++){
	alert(b[i]);
}



//改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<5; i++){
	alert(b[i]());
}


//改3
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<5; i++){
	alert(b[i]());
}

//关于this对象
var box ={
	getThis:function(){
		return function(){
			return this;
			}
	}
}

alert(box.getThis()()); //返回[object Window]


var user = 'the window';
var box = {
	user:'the box',
	getUser:function(){
		return this.user;
	}
}
alert(box.getUser());//the box
----------------------------------------------
var user = 'the window';
var box = {
	user:'the box',
	getUser:function(){
		//这里作用域的this是Box
		return function(){ //闭包在运行时时指向window的,因为闭包并不属于这个对象的属性或方法
			//这里作用域的this是window
			return this.user;
		}
	}
}
alert(box.getUser()());//the window
//对象冒充
alert(box.getUser().call(box));//the box



var user = 'the window';
var box = {
	user:'the box',
	getUser:function(){
		//这里作用域的this是Box
		var that = this;
		return function(){ //闭包在运行时时指向window的,因为闭包并不属于这个对象的属性或方法
			//这里作用域的this是window
			return that.user;
		}
	}
}
alert(box.getUser()());//the box


function box(){
	var oDiv = document.getElementById('oDiv');
	var text = oDiv.innerHTML;
	oDiv.onclick = function(){
		alert(text); //oDiv用完之后一直驻留在内存中,这里用oDiv导致内存泄漏
	}
	oDiv = null;//解除引用,等待垃圾回收
}
box();


// 块级作用域(私有作用域)
function box(){
	for(var i=0;i<5;i++){
		
	}
	alert(i);
}
box();

function box(count){
	for(var i=0;i<count;i++){}
	var i;                         //就算重新声明,也不会覆盖前面的值
	alert(i);
}
box(2);

function box(){
	(function(){             //包含自我执行的匿名函数,就可以实现私有作用域
		for(var i=0;i<5;i++){
		alert(i);
	}
	})();              //出了这个私有作用域,i被销毁了
	
	alert(i);                //这里就不认识i了
}
box();

(function(){
	//这里就是全局的私有作用域
	var age = 100;
	alert(age);
})();
alert(age); //age is not defined

//私有变量
function box(){
	var age = 100;         //私有变量,外部无法访问
}


function Box(){
	this.age = 100;                   //属性,公有的
	this.run = function(){            //方法,公有的
		return '运行中...';
	};
}

var box = new Box();
alert(box.age);
alert(box.run())


function Box(){
	var age = 100;            //私有变量
	function run(){           //私有方法
		return '运行中 ...';
	}
	this.publicGo = function(){  //对外可见的公共接口,特权方法
		return age + run();
	};
	this.getAge = function(){
		return age;
	}
}
var box = new Box();
//alert(box.age);                 //undefined
//alert(box.run());              //box.run is not a function
alert(box.publicGo());
alert(box.getAge());

//通过构造函数传参
function Box(value){
	var user = value;            //私有变量
	this.getUser = function(){
		return user;
	};
	this.setUser = function(value){
		user = value;
	};
}
var box = new Box('Lee');
alert(box.getUser());
box.setUser('ooo');
alert(box.getUser());

//静态属性
(function(){
	var user='';
	Box = function(value){
		user = value;
	};
	Box.prototype.getUser = function(){
		return user;
	};
	Box.prototype.setUser = function(value){
		user = value; 
	};
	}
	)();
	
	var box = new Box('Lee');
	alert(box.getUser());
	var box2 = new Box('KKK');
	alert(box.getUser());
	box2.setUser('ooo');
	alert(box.getUser());


var box = function(){
	var user = 'Lee';                    //私有变量
	function run(){                      //私有函数
		return '运行中...';
	}
	return{
		publicGo:function(){
			return user + run();         //对外公共接口的特权方法
		}
	};
}();

alert(box.publicGo());


var box = function(){
	var user = 'Lee';                    //私有变量
	function run(){                      //私有函数
		return '运行中...';
	}
	var obj={
		publicGo:function(){
			return user + run();         //对外公共接口的特权方法
		}
	};
	return obj;
}();

alert(box.publicGo());


function Desk(){
}

var box = function(){
	var user = 'Lee';                    //私有变量
	function run(){                      //私有函数
		return '运行中...';
	}
	var desk = new Desk();
	desk.publicGo = function(){
		return user + run();
	};
	return desk;
}();

alert(box.publicGo());

猜你喜欢

转载自blog.csdn.net/fanrenxiaoshan/article/details/80689850