天天看點

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>
           

繼續閱讀