javaScript中的匿名函數和閉包(第1篇)
javaScript中的匿名函數和閉包(第2篇)
javaScript中的匿名函數和閉包(第3篇)
直接po圖和代碼
<!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>