匿名函式和閉包的相關應用詳解
本章節詳細介紹一下匿名函式和閉包的相關應用,需要的朋友可以做一下參考。
一.匿名函式:
所謂匿名函式就是沒有名稱的函式,非具名函式。
(1).具名函式的建立:
建立方式一:
[JavaScript] 純文字檢視 複製程式碼function func(webName) { console.log(webName); }
上面是最為常見的建立函式的方式。
建立方式二:
[JavaScript] 純文字檢視 複製程式碼var func = new Function('webName', 'console.log(webName);');
關於建構函式Function可以參閱javascript Function()建構函式簡單介紹一章節。
建立方式三:
[JavaScript] 純文字檢視 複製程式碼var func = function (webName) { console.log(webName); }
上面的程式碼其實右側是建立的一個匿名函式,然後將匿名函式的地址賦值給變數func。
(2).匿名函式的建立:
上面第三種就是一個匿名函式的建立。
下面再來看一種方式:
[JavaScript] 純文字檢視 複製程式碼(function (webName) { console.log(webName); })("螞蟻部落");
二.閉包:
所謂的閉包簡單的說就是函式的巢狀,內層的函式可以使用外層函式的變數,即使外層函式已經執行完畢,變數依然駐留記憶體的一種現象。更多相關內容可以參閱javascript閉包概念簡單解析一章節。
程式碼例項一:
[JavaScript] 純文字檢視 複製程式碼function func() { var url = "softwhy.com"; return function () { console.log(url); } } var antzone = func(); antzone();
下面就對上面的程式碼做一下簡單介紹:
通常情況下,如果一個函式執行完畢,那麼它內部的變數都會銷燬,但是func函式內部巢狀有一個匿名函式,func()函式執行的時候,會返回此匿名函式,又因為匿名函式會使用變數url,所以此變數不會被銷燬。只有當antzone()執行完畢,變數url才會被釋放。
程式碼例項二:
使用閉包優化程式碼,原來的程式碼如下:
[JavaScript] 純文字檢視 複製程式碼function forTimeout(x, y) { console.log(x + y); } function delay(x, y, time) { setTimeout('forTimeout(' + x + ',' + y + ')', time); }
程式碼優化如下:
[JavaScript] 純文字檢視 複製程式碼function delay(x , y , time){ setTimeout( function(){ forTimeout(x , y) } , time); }
上面的程式碼是不是更加清晰,編寫起來也更加容易了。
使用匿名函式可以建立閉包,並且還可以構建名稱空間,以減少全域性變數的使用。
程式碼例項三:
[JavaScript] 純文字檢視 複製程式碼var oEvent = {}; (function () { var addEvent = function () { //code }; function removeEvent() { //code } oEvent.addEvent = addEvent; oEvent.removeEvent = removeEvent; })();
函式addEvent和removeEvent都是區域性變數。
但可以通過全域性變數oEvent使用它,這就減少全域性變數的使用,增強了網頁的安全性。
程式碼例項四:
先看一段程式碼例項,這是關於匿名函式的:
[JavaScript] 純文字檢視 複製程式碼var rainman = (function (x, y) { return x + y; })(2, 3); console.log(rainman);
再來看如下程式碼:
[JavaScript] 純文字檢視 複製程式碼var rainman = function(x , y){ return x + y; }(2, 3); console.log(rainman);
這個程式碼和上面的程式碼其實是一回事,上面的程式碼使用小括號將匿名函式包裹可以讓程式碼更加清晰。
程式碼示例五:
[JavaScript] 純文字檢視 複製程式碼var outer = null; (function () { var one = 1; function inner() { one += 1; console.log(one); } outer = inner; })(); outer(); outer(); outer();
這段程式碼中的變數one是一個區域性變數(因為它被定義在一個函式之內),因此外部是不可以訪問的。
這裡建立inner函式,此函式是可以訪問變數one;又將全域性變數outer引用inner,所以三次呼叫outer會彈出遞增的結果。
相關文章
- 淺談匿名函式和閉包函式
- 閉包函式(匿名函式)的理解函式
- JavaScript 匿名函式 閉包JavaScript函式
- 好程式設計師前端教程之JavaScript閉包和匿名函式的關係詳解程式設計師前端JavaScript函式
- PHP 回撥、匿名函式和閉包PHP函式
- 3. 匿名函式與閉包函式
- PHP 中的匿名函式和閉包基礎學習PHP函式
- PHP新特性之閉包、匿名函式PHP函式
- PHP閉包函式使用詳解PHP函式
- 閉包函式,裝飾器詳解函式
- 【Go語言學習】匿名函式與閉包Go函式
- 閉包詳解二:JavaScript中的高階函式JavaScript函式
- 匿名函式(lambda)詳解 C++函式C++
- JS閉包函式和回撥函式JS函式
- 函式閉包函式
- 閉包函式函式
- 微信小程式開發教程(基礎篇)4-關於回撥函式,匿名函式,閉包的雜談微信小程式函式
- 閉包匿名函式,還在傻傻搞不清楚嗎?函式
- JavaScript4:函式和閉包JavaScript函式
- 深入理解javascript原型和閉包(2)——函式和物件的關係JavaScript原型函式物件
- js中的函式巢狀和閉包JS函式巢狀
- go 閉包函式Go函式
- js函式閉包JS函式
- python 關於 函式物件與閉包Python函式物件
- 1.13 JavaScript4:函式和閉包JavaScript函式
- 淺談C#的函式建立和閉包C#函式
- 回撥函式 與 函式閉包函式
- 全面瞭解Vue3的 reactive 和相關函式VueReact函式
- Win32 API CreateCompatibleDC 函式的相關應用Win32API函式
- swift1.2語言函式和閉包函式介紹Swift函式
- js函式 函式自呼叫 返回函式的函式 (閉包)JS函式
- JS閉包函式概念JS函式
- 課時20:內嵌函式和閉包函式
- 探索c#之函式建立和閉包C#函式
- python中的閉包函式Python函式
- JS函式表示式——函式遞迴、閉包JS函式遞迴
- gethostbyname函式和getservbyname函式的應用函式
- 函式物件、裝飾器、閉包函式函式物件