一.匿名函數
//普通函數數組
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 的值。