匿名函數和閉包

一.匿名函數
//普通函數數組

function fun1() { //函數名是box
return '張三';
}

//匿名函數閉包

function () { //匿名函數,會報錯
return '張三';
}

//經過表達式自我執行函數

(function fun1() { //封裝成表達式
alert('張三');
})(); //執行函數

//把匿名函數賦值給變量性能

var fun1 = function () { //將匿名函數賦給變量
return '張三';
};
alert(fun1()); //調用方式和函數調用類似

//函數裏的匿名函數spa

function fun1 () {
return function () { //函數裏的匿名函數,產生閉包
return '張三';
}
}
alert(fun1()()); //調用匿名函數

二.閉包
閉包是指有權訪問另外一個函數做用域中的變量的函數,建立閉包的常見的方式,就是在一個函數內部建立另外一個函數,經過另外一個函數訪問這個函數的局部變量。
//經過閉包能夠返回局部變量code

function fun1() {
var user = '張三';
return function () { //經過匿名函數返回box()局部變量
return user;
};
}
alert(fun1()()); //經過box()()來直接調用匿名函數返回值
var b = fun1();
alert(b()); //另外一種調用匿名函數返回值

使用閉包有一個優勢,也是它的缺點:就是能夠把局部變量駐留在內存中,能夠避免使用全局變量。blog

//經過全局變量來累加內存

var age = 100; //全局變量
function func() {
age ++; //進行累加
}
func(); //執行函數,累加了
alert(age); //輸出全局變量

//經過局部變量沒法實現累加資源

function func() {
var age = 100;
age ++; //累加
return age;
}
alert(func()); //101
alert(func()); //101,沒法實現,由於又被初始化了

//經過閉包能夠實現局部變量的累加作用域

function func() {
var age = 100;
return function () {
age ++;
return age;

}
}
var b = func(); //得到函數
alert(b()); //調用匿名函數
alert(b()); //第二次調用匿名函數,實現累加

因爲閉包裏做用域返回的局部變量資源不會被馬上銷燬回收,因此可能會佔用更多的內存。過分使用閉包會致使性能降低,建議在很是有必要的時候才使用閉包。

//循環裏包含匿名函數

functionfunc() {
var arr = [];
for (var i = 0; i < 5; i++) {
arr[i] = function () {
return i;
};
}
return arr;
}
var b = func(); //獲得函數數組
alert(b.length); //獲得函數集合長度
for (var i = 0; i < b.length; i++) {
alert(b[i]()); //輸出每一個函數的值,都是最後一個值
}

上面的例子輸出的結果都是5,也就是循環後獲得的最大的i 值。由於b[i]調用的是匿名函數,匿名函數並無自我執行,等到調用的時候,box()已執行完畢,i 早已變成5,所
以最終的結果就是5 個5。
//循環裏包含匿名函數,自我執行匿名函數

function func() {
var arr = [];
for (var i = 0; i < 5; i++) {
arr[i] = (function (num) { //自我執行
return num;
})(i); //而且傳參
}
return arr;

var b =func();
for (var i = 0; i < b.length; i++) {
alert(b[i]); //這裏返回的是數組,直接打印便可
}

咱們讓匿名函數進行自我執行,致使最終返回給a[i]的是數組而不是函數了。最終致使b[0]-b[4]中保留了0,1,2,3,4 的值。

相關文章
相關標籤/搜索