首頁 web前端 js教程 為什麼不使用 JS 匿名函數

為什麼不使用 JS 匿名函數

Jan 18, 2018 pm 01:13 PM
javascript 為什麼 函數

本文主要給大家分析了不使用js匿名函數的三大理由,匿名函數的作用是避免全局變數的污染以及函數名的衝突,關於js匿名函數的三大理由大家參考下本文,希望能幫助大家。

匿名函數的基本形式為(function(){...})();

#前面的括號包含函數體,後面的括號就是傳遞參數給匿名函數並且立即執行之

匿名函數的作用是避免全域變數的污染以及函數名稱的衝突

無論你在什麼時候讀程式碼,您都必須注意到匿名函數。有時它們被稱為 lambda,有時是匿名函數,不管怎樣,我認為他們是不好使用的。

如果你不知道匿名函數是什麼,這裡有一個引語:

匿名函數是一種在運行時動態宣告的函數。它們之所以被稱為匿名函數是因為不同於普通函數,它們並沒有函數名 。 — Helen Emerson, Helephant.com

匿名函數形式如下:

function () { ... code ... }
OR
(args) => { ... code .. }
登入後複製

我今天嘗試讓大家理解通常情況下只有在絕對需要的情況下才使用匿名函數的想法。匿名函數不應該是首選,而且應該知道原因情況下使用。當理解這種想法之後,你的程式碼會變得更簡潔,更容易維護,更容易追蹤bug。先從避免使用匿名函數的三個理由開始:

你寫程式碼的時候, 無論你多麼擅長敲程式碼, 總是會碰到錯誤。有時候,這些錯誤很容易被查出,有時並不容易。

如果你知道這些錯誤來自哪裡,那麼錯誤就很容易被查出來。為了找出錯誤,我們使用這個被叫做堆疊軌跡的工具。如果你不了解 堆疊軌跡 ,goole給了一個很棒的介紹。

假設現在有一個很簡單的工程:

function start () {
 (function middle () {
 (function end () {
  console.lg('test');
 })()
 })()
}
登入後複製

上面程式碼裡面有一個很愚蠢的錯誤,拼字錯誤(console.log)。在小工程裡面,這個拼字錯誤不是什麼大問題。 如果這是一個有非常多模組非常大的工程的一小段,問題就大了。假設這個愚蠢的錯誤不是你犯的,那麼新來的初級工程師將會在他休假之前把這個錯誤提交到程式碼庫!

現在,我們必須追蹤。 使用我們精心命名的函數, 我們得到如下的堆疊追蹤:

謝謝你命名你的函數 ,初級開發者們! 現在我們可以輕鬆地追蹤到這個bug。

但是..一旦我們解決了這個問題,就會發現 還有另一個bug。 這次是一位更資深的開發人員介紹的。這個人知道 lambdas
結果他們偶然發現了一個bug,我們的工作就是追蹤它。

下面是程式碼:

(function () {
 (function () {
 (function () {
  console.lg('test');
 })();
 })();
})();
登入後複製

吃驚,這位開發者也忘瞭如何拼寫console.log了!這也太巧合了吧!令人感到遺憾的是,他們都沒有命名他們的函數。

那麼控制台會輸出什麼呢?

好吧,我們至少還有行號,對吧?在這個例子中,看起來我們有大約7行程式碼。如果我們處理一大段程式碼會如何呢?比如一萬行程式碼?行號的跨度如此之大該怎麼辦?如果程式碼被折疊後有沒有一個程式碼地圖文件,那麼行號的渲染是不是根本就是沒有什麼用了呢?

我想對這些問題的回答相當簡單,答案就是:想這些會讓你一整天都會過的相當糟心。

可讀性

咦,我聽說你還不信。你仍舊對你的匿名函數戀戀不捨,而且從未發生過bug。那我得向你道歉,你認為你的程式碼是完美的。讓我們看看這個!

看看下面兩段程式碼:

function initiate (arguments) {
 return new Promise((resolve, reject) => {
 try {
  if (arguments) {
   return resolve(true);
  }
  return resolve(false);
 } catch (e) {
  reject(e);
 }
 });
}
initiate(true)
 .then(res => {
  if (res) {
   doSomethingElse();
  } else {
   doSomething();
  }
 ).catch(e => {
   logError(e.message);
   restartApp();
   }
 );
登入後複製

這是一個非常不正常的例子,但是我相信你已經明白我要說什麼 了。我們的方法回傳了一個promise,我們用這個promise物件/方法處理不同可能的 回應。

你也許會認為幾段程式碼讀起來並不難,但我認為它們可以變得更好!

如果我們去掉所有的匿名函式會怎麼樣呢?

function initiate (arguments) {
 return new Promise(checkForArguments);
}
function checkForArguments (resolve, reject) {
 try {
 if (arguments) {
  return resolve(true); 
 }
 return resolve(false);
 } catch (e) {
 reject(e);
 }
}
function evaluateRes (res) {
 if (res) {
 doSomethingElse();
 } else {
 doSomething();
 }
}
function handleError (e) {
 logError(e.message);
 restartApp();
}
initiate(true)
 .then(evaluateRes)
 .catch(handleError);
登入後複製

好,先講清楚:這部分程式碼更長,但我認為其不僅僅是有更多的可讀性!我們精心命名的函數與匿名函數不一樣,只要我們一看到它們的名字就知道它們的功能是什麼。這避免了在評估代碼時的障礙。

這也有助於分清楚其中的關係。與創建一個方法、將其傳遞、然後運行邏輯不同,在第二個例子中的參數被給了then,catch只是指向了發生所有事情的函數。

關於更具有可讀性,我沒有什麼再能說服你的了。但是也許你還沒被說服的話,我可以試試看最後的論點。

相關推薦:

js給按鈕循環設定匿名函數的問題

常用匿名函數

#js匿名函數使用與傳參實例詳解

以上是為什麼不使用 JS 匿名函數的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

H5頁面製作是否需要持續維護 H5頁面製作是否需要持續維護 Apr 05, 2025 pm 11:27 PM

H5頁面需要持續維護,這是因為代碼漏洞、瀏覽器兼容性、性能優化、安全更新和用戶體驗提升等因素。有效維護的方法包括建立完善的測試體系、使用版本控制工具、定期監控頁面性能、收集用戶反饋和製定維護計劃。

在router文件夾下的index.js文件中為什麼需要調用Vue.use(VueRouter)? 在router文件夾下的index.js文件中為什麼需要調用Vue.use(VueRouter)? Apr 05, 2025 pm 01:03 PM

在router文件夾下的index.js文件中註冊VueRouter的必要性在開發Vue應用程序時,常常會遇到關於路由配置的問題。特�...

沒有H5,JS能運行嗎? 沒有H5,JS能運行嗎? Apr 06, 2025 am 09:06 AM

JavaScript 是否可在無 HTML5 環境下運行? JavaScript 引擎自身可獨立運行。在瀏覽器環境中運行 JavaScript 依賴 HTML5,因其提供加載和執行代碼所需的標準化環境。 HTML5 提供的 API 和特性對現代 JavaScript 框架和庫至關重要。離開 HTML5 環境,許多 JavaScript 功能難以實現或無法實現。

為什麼Flex佈局中的紫色斜線區域會被誤認為是'溢出空間”? 為什麼Flex佈局中的紫色斜線區域會被誤認為是'溢出空間”? Apr 05, 2025 pm 05:51 PM

關於Flex佈局中紫色斜線區域的疑問在使用Flex佈局時,你可能會遇到一些令人困惑的現象,比如在開發者工具(d...

為什麼在Safari中自定義樣式表能在本地網頁生效,但在百度頁面上卻無法生效? 為什麼在Safari中自定義樣式表能在本地網頁生效,但在百度頁面上卻無法生效? Apr 05, 2025 pm 05:15 PM

在Safari中使用自定義樣式表的問題探討今天我們來探討一個關於Safari瀏覽器的自定義樣式表應用問題。前端新手...

H5頁面製作的優勢有哪些 H5頁面製作的優勢有哪些 Apr 05, 2025 pm 11:48 PM

H5 頁面製作的優勢包括:輕量級體驗,加載速度快,提升用戶留存率。跨平台兼容性,無需針對不同平台適配,提升開發效率。靈活性和動態更新,無需審核,便於內容修改和更新。成本效益,開發成本比原生 App 低。

無法以 root 身份登錄 mysql 無法以 root 身份登錄 mysql Apr 08, 2025 pm 04:54 PM

無法以 root 身份登錄 MySQL 的原因主要在於權限問題、配置文件錯誤、密碼不符、socket 文件問題或防火牆攔截。解決方法包括:檢查配置文件中 bind-address 參數是否正確配置。查看 root 用戶權限是否被修改或刪除,並進行重置。驗證密碼是否準確無誤,包括大小寫和特殊字符。檢查 socket 文件權限設置和路徑。檢查防火牆是否阻止了 MySQL 服務器的連接。

為什麼Edge瀏覽器中的特定div元素無法顯示?如何解決這個問題? 為什麼Edge瀏覽器中的特定div元素無法顯示?如何解決這個問題? Apr 05, 2025 pm 08:21 PM

如何解決用戶代理樣式表導致的顯示問題?在使用Edge瀏覽器時,項目中的一個div元素無法顯示。經過查看,發�...

See all articles