這篇文章帶給大家的內容是關於JavaScript中的Generator函數的用法介紹(附程式碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。
語法上
首先可以把它理解成,Generator 函數是一個狀態機,封裝了多個內部狀態。執行 Generator 函數會傳回遍歷器對象,也就是說,Generator 函數除了狀態機,也是遍歷器物件產生函數。傳回的遍歷器對象,可以依序遍歷 Generator 函數內部的每一個狀態。
形式上
Generator 函數是一個普通函數,但是有兩個特徵。
一是,function關鍵字與函數名之間有一個星號;
二是,函數體內部使用yield表達式,定義不同的內部狀態(yield在英文裡的意思就是“產出”)。
呼叫上
Generator 函數的呼叫方法與普通函數一樣,也是在函數名稱後面加上一對圓括號。不同的是,在呼叫 Generator 函數後,函數並不執行,傳回的不是函數運行結果,而是指向內部狀態的指針對象,也就是上一章介紹的遍歷器物件(Iterator Object)。我們必須呼叫遍歷器物件的next方法,使得指標移向下一個狀態。也就是說,每次呼叫next方法,內部指標就會從函數頭部或上次停下來的地方開始執行,直到遇到下一個yield表達式(或return語句)為止。換言之,Generator 函數是分段執行的,yield表達式是暫停執行的標記,而next方法可以恢復執行
function* helloWorldGenerator() { yield 'hello'; yield 'world'; return 'ending'; } var hw = helloWorldGenerator(); hw.next() // { value: 'hello', done: false } hw.next() // { value: 'world', done: false } hw.next() // { value: 'ending', done: true } hw.next() // { value: undefined, done: true }
調用 Generator 函數,返回一個遍歷器對象,代表 Generator 函數的內部指針。以後,每次呼叫遍歷器物件的next方法,就會傳回一個有著value和done兩個屬性的物件。 value屬性表示目前的內部狀態的值,是yield表達式後面那個表達式的值;done屬性是一個布林值,表示是否遍歷結束。
yield表達式
yield表達式與return語句既有相似之處,也有差別。相似之處在於,都能傳回緊接在語句後面的那個表達式的值。差別在於每次遇到yield,函數暫停執行,下次再從該位置繼續往後執行,而return語句不具備位置記憶的功能。一個函數裡面,只能執行一次(或說一個)return語句,但是可以執行多次(或說多個)yield表達式。正常函數只能傳回一個值,因為只能執行一次return;Generator 函數可以傳回一系列的值,因為可以有任意多個yield。從另一個角度來看,也可以說 Generator 產生了一系列的值,也就是它的名稱的來歷(英文中,generator 這個字是「生成器」的意思)。
語法注意點:
1、yield表達式只能用在Generator 函數裡面
2、yield表達式如果用在另一個表達式之中,必須放在圓括號裡面
3、yield表達式用作函數參數或放在賦值表達式的右邊,可以不加括號。
例如:
function* demo() { foo(yield 'a', yield 'b'); // OK let input = yield; // OK }
next 方法的參數
yield表達式本身沒有回傳值(就是說let a=yield ;會回傳undefined),或者說總是回傳undefined。 next方法可以帶一個參數,該參數就會被當作上一個yield表達式的回傳值 (注意,是表達式的回傳值,例如let a=yield..........參數會是a 的值並且會覆寫表達式之前的值)。
function* f() { for(var i = 0; true; i++) { var reset = yield i; console.log(reset); if(reset) { i = -1; } } } var g = f(); g.next()
由於next方法的參數表示上一個yield表達式的回傳值,所以在第一次使用next方法時,傳遞參數是無效的。 V8 引擎直接忽略第一次使用next方法時的參數,只有從第二次使用next方法開始,參數才是有效的。從語意上講,第一個next方法用來啟動遍歷器對象,所以不用帶有參數。
【相關推薦:JavaScript影片教學】
#以上是JavaScript中的Generator函數的用法介紹(附程式碼)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

JavaScript在現實世界中的應用包括服務器端編程、移動應用開發和物聯網控制:1.通過Node.js實現服務器端編程,適用於高並發請求處理。 2.通過ReactNative進行移動應用開發,支持跨平台部署。 3.通過Johnny-Five庫用於物聯網設備控制,適用於硬件交互。

我使用您的日常技術工具構建了功能性的多租戶SaaS應用程序(一個Edtech應用程序),您可以做同樣的事情。 首先,什麼是多租戶SaaS應用程序? 多租戶SaaS應用程序可讓您從唱歌中為多個客戶提供服務

本文展示了與許可證確保的後端的前端集成,並使用Next.js構建功能性Edtech SaaS應用程序。 前端獲取用戶權限以控制UI的可見性並確保API要求遵守角色庫

JavaScript是現代Web開發的核心語言,因其多樣性和靈活性而廣泛應用。 1)前端開發:通過DOM操作和現代框架(如React、Vue.js、Angular)構建動態網頁和單頁面應用。 2)服務器端開發:Node.js利用非阻塞I/O模型處理高並發和實時應用。 3)移動和桌面應用開發:通過ReactNative和Electron實現跨平台開發,提高開發效率。

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。

Python更适合数据科学和机器学习,JavaScript更适合前端和全栈开发。1.Python以简洁语法和丰富库生态著称,适用于数据分析和Web开发。2.JavaScript是前端开发核心,Node.js支持服务器端编程,适用于全栈开发。


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

記事本++7.3.1
好用且免費的程式碼編輯器

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

SublimeText3漢化版
中文版,非常好用