天天看点

javaScript中的匿名函数和闭包(第1篇)

javaScript中的匿名函数和闭包(第1篇)

javaScript中的匿名函数和闭包(第2篇)

javaScript中的匿名函数和闭包(第3篇)

直接po图和代码

javaScript中的匿名函数和闭包(第1篇)
javaScript中的匿名函数和闭包(第1篇)
javaScript中的匿名函数和闭包(第1篇)
javaScript中的匿名函数和闭包(第1篇)
javaScript中的匿名函数和闭包(第1篇)
javaScript中的匿名函数和闭包(第1篇)
javaScript中的匿名函数和闭包(第1篇)
javaScript中的匿名函数和闭包(第1篇)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>javaScript中的匿名函数和闭包(第1篇)</title>
<script type="text/javascript">
	
	//普通函数
	function hello(){
		return '令狐冲';
	}
	console.log(hello());
	
	
	//匿名函数(没有名字的函数被称为匿名函数),如下会报错
	//单独的匿名函数,是无法运行的,就算能运行,也无法调用,因为没有名字
/*
	function (){
		console.log('我是一个匿名函数');
	}
*/

//将匿名函数赋值给一个变量
var fun1 = function (){
	return '红红火火恍恍惚惚,我是一个匿名函数';
}; //var fun1 = 等于号右边的是一个完整的语句,既然是一个语句,最好在语句后面加一个;分号

console.log(fun1);

//调用匿名函数
console.log(fun1());



/*
 通过表达式自我执行
*/
 
//通过自我执行来执行匿名函数
/*
 语法:
 (匿名函数)(); //第一个圆括号中放匿名函数,第二个圆括号是执行的意思
*/
	(function() {
		console.log('江西省赣州市于都县');
	})(); //封装成表达式,第二个圆括号表示执行函数,并且传参


//还有如下这种写法也是可以的
/*
 语法:
 (匿名函数()); 
*/
(function() {
	console.log('赣州市于都县');
}());


//把匿名函数自我执行的返回值赋给变量
	var v1 = (function() {
		return '好好工作,努力赚钱';
	})();
console.log(v1);


//将匿名函数的自我执行的返回值打印出来
console.log((function (){return '一万年太久只争朝夕';})());

//自我执行匿名函数的传参
	(function(age) {
		console.log('我今年' + age + '岁了');
	})(12);
	

//
function show(){
	return function (){ //闭包(函数里的匿名函数,产生闭包)
		return '天若有情天亦老,人间正道是沧桑';
	};
}
console.log(show);
// alert(show);
console.log(show());
// alert(show());
console.log(show()());
var f1 = show();
console.log(f1);
// alert(f1);
console.log(f1());

//匿名函数里面再放一个匿名函数也是可以的,以后再说


function f2(){
	//局部变量,私有变量
	var age = 12;
}
//访问不到局部变量
// console.log(age); //报错age is not defined

//通过闭包返回局部变量
function f3(){
	var money = 16500.85;
	return function (){
		return money; 
	};
}

console.log(f3()());
var f4 = f3();
console.log(f4());

/*
使用 闭包有一个优点,也是它的缺点,就是可以把局部变量驻留在内存中,
 可以避免使用全局变量。(全局变量污染导致应用程序不可预测性,每个模块都可调用必将引来灾难)
 所以推荐使用私有的,封装的局部变量
*/

//使用全局变量进行累加
var myAge = 6;
function f5(){
	myAge++;
}
console.log(myAge);
f5();
console.log(myAge);
f5();
console.log(myAge);
f5();
console.log(myAge);

//使用局部变量进行累加
function f6(){
	var youAge = 13;
	youAge++;
	return youAge;
}
console.log(f6()); //结果为14
console.log(f6()); //结果为14
console.log(f6()); //结果为14
console.log(f6()); //结果为14
 
//使用匿名函数实现局部变量驻留内存中从而累加
function f7(){
	var salary = 17500.66; //局部变量
	return function (){
		salary++;
		return salary; 
	}
}

var f8 = f7();
console.log(f8());
console.log(f8());
console.log(f8());
//直接访问f7()函数内部的salary这个局部变量是访问不到的
// console.log(salary); //报错salary is not defined
console.log(f8);

/*
由于闭包里作用域返回的局部变量资源不会被立刻销毁回收,
所以可能会占用更多的内存。过度使用闭包会导致性能下降,
建议在非常有必要的时候才使用闭包
*/

//
f8 = null; //解除引用,等待垃圾回收
console.log(f8);
// console.log(f8()); //报错f8 is not a function
 

</script>
</head>
<body>
<h1>javaScript中的匿名函数和闭包(第1篇)</h1>
</body>
</html>
           

继续阅读