generator yield到底是個啥

2022-08-28 09:36:13 字數 2528 閱讀 8357

先來乙個函式

function *show() 

let gen =show();

gen.next(12);

gen.next(5);

通過函式我們可以看到,定義a接收了yield傳進來的引數,現在請大家和我玩個遊戲,猜猜看a是幾

好了,不賣關子了,咱們執一下看看

那麼現在反過來就有乙個問題了,可能有些人會說,等會,我有點看不明白了,我怎麼覺得應該是12呢,怎麼回事呢?

好,簡答的說一說為什麼是5,這個實際上來說是yield裡面特別好玩的一件事,大家允許我用乙個小小的方法(用一張圖來說明)

從上面的圖上,我們可以看到畫紅框的地方,執行的是我用紅筆圈起來的這部分**,畫綠框的地方,執行的是用綠筆圈起來的**

我們把它簡答的看做兩個過程,第乙個過程傳進去的引數是12,第二個過程傳遞進去的引數是5,所以我們的a接收到的是我們第二個過程裡傳進去的5,沒問題吧,當然還是那句話,別較真,認真你就輸了,大家都懂的哈

那麼所以通過yield傳參的時候,第乙個next是廢的,傳什麼都不好使,傳什麼都白傳,這個時候大家可能會問了,那我想給第乙個過程傳參,該怎麼辦呢?你說怎麼辦,不就是我們過去的傳參方法嘛,我們傳乙個num1,乙個num2,然後接收一下,咱試試哈

function *show(num1, num2) , $`);

alert('a');

let a =yield;

alert(a);

alert('b');

}let gen = show(99, 88);

gen.next(12);

gen.next(5);

這樣執行的話,可以正常接收我們傳進來的引數

而通過這個過程,我們可以看到,第乙個next對於傳參來說,是廢的,沒辦法給yield傳參的,想給第乙個過程傳遞引數,就得像正常函式一樣,通過函式(引數)的形式來

二、yield可以返回

咱們剛剛說了yield的第乙個功能是可以往裡面傳東西,下面我們說一說yield的另乙個功能,可以往外吐東西(返回)

咱們在上面把乙個大的generator函式劃分為幾個過程,通過yield來分割這幾個過程,我們可以理解為中間結果

舉個最簡單的例子,就像我做菜一樣,當然我這人不會做菜,連鍋都能糊了,可好玩了,有時間再和大家慢慢扯哈

就拿做菜來說,我們可以分為幾個步驟:洗菜、切菜、炒菜

我們可以認為,在最開始輸入了剛買回來的菜,也相當於我們函式的引數,接下來的每一步都有乙個半成品(剛買回來的菜),它也就相當於我們下一步的輸入,最後變成一盤炒好的菜。說白了,在這個函式裡,每一步都會有乙個中間結果,也算是中間的輸入。

從第一步的yield可以傳參到第二步的yield有個中間結果,下面我們看一看yield是如何返回的

function *show() 

let gen =show();

let res1 =gen.next();

console.log(res1);

//let res2 =gen.next();

console.log(res2);

//

咱們還是和剛才一樣,定義乙個generator函式,定義兩個過程,將next函式的返回值列印出來之後可以看到,第乙個過程中返回了

,第二個過程返回了,在第乙個過程裡,value是12,done是false,done是完成的意思,因為第乙個過程並不是函式結束,所以返回的是false,而第二個返回值中,value為什麼是undefined呢?

原因很簡單,咱們在上面的切菜圖上說的很明白了,這個階段是咱們函式的最後一道工序,最後一道工序就沒有yield了,所以也就沒有返回值了,想返回東西的話,就只能用return來返回。

請允許我用乙個更俗的例子來把這事說的更清楚。

三、yield到底是個啥

咱們用偽**定義了乙個generator函式,咱名字就叫炒菜,最初的引數是剛從菜市場買回來的菜,第一步完成洗菜的過程,然後通過yield把洗好的菜傳遞給下乙個過程,下乙個人拿到乾淨的菜之後把它切成塊,切成絲,再通過yield傳給下乙個人,然後下乙個人拿到切好的菜之後,就可以炒了,最後我們得到熟的菜,把它return出去。下面咱們畫一畫,幫助大家更好的理解

generator,yield個人理解

實驗 1 function test1 arg 200 6 78function test2 0 12 13 編寫乙個generator 14function gen 2021 var it gen 1.存在乙個gen 函式,第14行 存在兩個yield 語句,15,17 2.執行gen 函式 21...

記錄從半夜到凌晨到拂曉到黎明到清晨

每次看星星都會被震撼 再怎麼拍,都表達不出肉眼所見到 謝謝陪伴,即使黑暗無邊無際 我也不會害怕 星光漸漸退去 天邊染上橘黃 怎麼才能更好的看星星 看星星脖子疼怎麼辦?躺地上不就好了嘛 這樣不冷嗎?當然不冷了,如果你覺得冷的話 請站起來用力奔跑 天空閃過兩顆流星 不知跨越多少光年 才來到我的眼前 路燈...

從資料到資訊到決策

俗話說,忘記歷史就是背叛自己,今天這篇用此做開場再合適不過。這一篇將根據乙個虛擬的故事,來介紹如何通過歷史資料來幫助乙個銷售人員發現規律資訊從而輔助他來做一些決策資訊。本文的主角是tim,tim在乙個銷售部門,部門最近決定做新一輪銷售計畫,然後根據計畫結束時,各個銷售人員的銷售業績來進行kpi考核。...